Как выполнить логическое сравнение с использованием динамического T-SQL с пустой строкой? - PullRequest
0 голосов
/ 24 августа 2018

При выполнении примера кода, включенного ниже, с переменными, которые я включил, где name / pw установлены в пустые строки (''), оператор сравнения iif не возвращает ноль ни при каких обстоятельствах, насколько я могу судить.Я правильно выполняю эту проверку?Я новичок в динамическом SQL и пытаюсь преобразовать некоторые служебные скрипты, которые я написал, чтобы лучше понять.Я даже не начал пытаться объединять @SMTPPORT и @SMTPSSL вместо 25/0, потому что ошибка не имеет смысла в этой строке.

-- SMTP Settings if desired; leave blank if you wish to use defaults for troubleshooting
DECLARE @SMTPSERVER nvarchar(max) = 'localhost' -- SMTP Server, defaults to localhost
DECLARE @SMTPPort int = 25 -- SMTP Port, default 25
DECLARE @SMTPUID nvarchar(max) = '' -- SMTP Username
DECLARE @SMTPUPWD nvarchar(max) = '' -- SMTP Password
DECLARE @SMTPSSL int = 0 -- Enable TLS? 0 is default (no)
DECLARE @SMTPOverRide nvarchar(max) = '' -- E-mail sender override

DECLARE @SmtpCMD nvarchar(max) = N'
DELETE FROM TM_EmailConfiguration

INSERT INTO TM_EmailConfiguration (SMTPServer, SMTPUsername, SMTPPassword, SMTPPort, SMTPSSl, EmailSenderOverride, TMGUID, LMG, LMD, LMU)

VALUES (
    '''+ @SMTPSERVER + ''', 
    '+ (SELECT IIF ( @SMTPUID != '''', ''''+ @SMTPUID +'''', NULL)) + ', 
    '+ (SELECT IIF ( @SMTPUPWD != '''', ''''+@SMTPUPWD+'''', NULL))+ ', 
    25, 
    0, 
    ''Test@WK.com'', 
    (select * from V_TM_TMGUID), 
    (select * from V_TM_TMGUID), 
    getdate(), 
    ''Sean'')

'
EXECUTE SP_ExecuteSQL @SmtpCMD

1 Ответ

0 голосов
/ 24 августа 2018

Вы не должны удваивать одинарные кавычки в проверке сравнения.

Кроме того, как указал Грамбо, если вы хотите NULL в вашей динамической строке sql, вам нужно объединить строковое значение 'NULL' вместо фактического объединения NULL.

Вместо этого:

   '+ (SELECT IIF ( @SMTPUID != '''', ''''+ @SMTPUID +'''', NULL)) + ', 

вы должны делать это:

   '+ (SELECT IIF ( @SMTPUID != '', ''''+ @SMTPUID +'''', 'NULL')) + ', 

Наконец, я верю, что у вас есть цель самообразования для того, чтобы сделать это с динамическим sql, потому что ничего не делается вваш пример кода, который не может быть выполнен в обычном (нединамическом) sql.

И, наконец, в конечном коде, если вам нужно использовать динамический sql, потому что вы используете переменные для баз данных, таблиц и т. д.вы все еще можете избежать этого конкретного сравнения вне динамического контекста (сортировки, поскольку переменная существует вне его), используя удобную функцию NULLIF (), например:

NULLIF('''+@SMTPUID +''',''''), 

(Примечаниечто строка выше является INSIDE динамическим оператором sql. Единственное, что находится за его пределами, это +@SMTPUID +

...