Ответ на самом деле отличается между хранимыми процедурами и функциями.
С Books On Line или как там ее называют в этом месяце (Прокрутить вниз):
Когда параметр функции имеет значение по умолчанию,ключевое слово DEFAULT должно быть указано при вызове функции для получения значения по умолчанию.Это поведение отличается от использования параметров со значениями по умолчанию в хранимых процедурах, в которых пропуск параметра также подразумевает значение по умолчанию.Однако ключевое слово DEFAULT не требуется при вызове скалярной функции с помощью оператора EXECUTE.
Так что для процедуры, когда вы хотите передать параметр NULL
, вы можете просто не передавать его,Для функции, однако, вы должны указать ей явно использовать значение DEFAULT
.В любом случае, вы не передаете это явно NULL
.К счастью для вашего динамического SQL, явный DEFAULT
также работает с хранимой процедурой.В обоих случаях, чтобы убедиться, что параметры, которые вы передаете , правильно назначены, вы хотите использовать явные имена параметров в вашем вызове.
Давайте использовать это определение функции:
CREATE FUNCTION (or procedure) [qlik].udf_getStatistic (
@param1 integer = 0,
@param2 varchar(100) = 'foo'
) AS ...
Оба параметра являются необязательными.Поскольку это функция, этот вызов выдаст ошибку insufficient number of parameters
:
select * from [qlik].udf_getStatistic( 'Heights' );
Если бы это был вызов процедуры, он бы выдал cannot convert value 'Heights' to data type integer
, потому что он будет применять единственное значение параметра, переданное впервый встреченный параметр, который ожидает целое число.В обоих случаях вы получаете то, что вам нужно, таким образом:
select * from [qlik].udf_getStatistic( @param1 = DEFAULT, @param2 = 'Heights' );
, что приводит нас к вашему динамическому SQL.Добавьте ваши имена параметров к статическому тексту, затем используйте COALESCE
(или CASE
, если хотите), чтобы решить, передавать ли явное значение или вызов DEFAULT
.
DECLARE @myParameter1 VARCHAR(100) = 'foo',
@myParameter2 INTEGER,
@SQL NVARCHAR(MAX);
SET @SQL =
'select
*
from [qlik].udf_getStatistic(
@param1 = ''' + COALESCE(@myParameter1, 'DEFAULT') + ''',
@param2 = ' + COALESCE(CAST(@myParameter2 AS VARCHAR(30)),'DEFAULT') + ' );';
SELECT @SQL;
Результат:
select * from [qlik].udf_getStatistic( @param1 = 'foo', @param2 = DEFAULT );