Я использую RAISERROR()
для обеспечения некоторых базовых функций модульного тестирования (как здесь ), но я разочарован невозможностью использовать FLOATs
в сообщении об ошибке. Я знаю, что могу преобразовать float в строку, но я использую RAISERROR
в каждом модульном тесте, я не хочу добавлять еще одну строку кода для каждого теста. (Мои модульные тесты уже достаточно многословны!) Есть ли способ выполнить встроенное приведение / преобразование в RAISERROR
списке параметров? Или есть другой способ обойти этот недостаток?
Обновление: так что, в конечном итоге, я хотел бы сделать следующее:
RAISERROR('Unit Test FAILED! %f', 11, 0, @floatParm)
К сожалению, RAISERROR
не обрабатывает% f и не плавает вообще. Поэтому я должен сделать это вместо:
DECLARE @str VARCHAR(40) = CAST(@floatParm AS VARCHAR(40))
RAISERROR('Unit Test FAILED! %s', 11, 0, @str)
... которая выглядит как беспорядок, когда она разбросана по десяткам юнит-тестов. Поэтому я хотел бы свести это к следующему:
RAISERROR('Unit Test FAILED! %s', 11, 0, CAST(@floatParm AS VARCHAR(40))
Но это дает мне Incorrect syntax near 'CAST'
сообщение. Я не понимаю, почему это незаконно, но это так. Есть ли другой «один вкладыш», который я мог бы использовать здесь вместо этого?
источник
Ответы:
К сожалению, по какой-то причине вы не можете выполнить встроенное преобразование в этом контексте и
RAISERROR
не поддерживает напрямуюfloat
, опять же, по любой причине.Для полноты этого ответа вот соответствующий фрагмент из MSDN , который, я уверен, вы уже видели (примечание: это один и тот же текст во всех версиях документации с 2005 по 2012 годы):
Единственное разумное решение, о котором я могу подумать, - это написать хранимую процедуру, чтобы обернуть
RAISERROR
вызов. Вот отправная точка:К сожалению, нет простого способа масштабировать это для произвольного числа параметров ... Это, вероятно, можно сделать с помощью сложного вложенного динамического SQL, который было бы интересно отлаживать. Я оставлю это как упражнение для читателя.
Я использовал
sql_variant
предположение, что по причинам единообразия кода одна и та же процедура будет использоваться везде, даже для типов значений, которые поддерживаются напрямуюRAISERROR
. Кроме того, это может быть создано как временная хранимая процедура, если это уместно.Вот как будет выглядеть эта процедура:
Выход:
Таким образом, общий результат заключается в том, что вы не получаете возможность форматирования для чисел с плавающей запятой (сверните свое собственное), но вы получаете возможность выводить их (также десятичную / числовую!), Сохраняя возможность форматирования для других типов.
источник
sql_variant
, поэтому застрял в списке аргументов и предположил, что это невозможно. Вы научили меня чему-то очень полезному сегодня. Большое спасибо!