如何使用带有空字符串的动态 T-SQL 执行逻辑比较?

How do I perform a logic comparison using dynamic T-SQL with an empty string?

执行下面包含的示例代码时,我在 name/pw 中包含的变量设置为空白字符串 (''),iif 比较运算符在任何情况下都不会返回 null我看得出来。我是否正确地执行了这项检查?我是动态 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

您不应该在比较检查中将单引号加倍。

此外,正如 Grambo 指出的那样,如果想在动态 sql 字符串中使用 NULL,则需要连接字符串值 'NULL' 而不是实际连接 NULL.

而不是这个:

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

你应该这样做:

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

最后,我相信您使用动态 sql 执行此操作有一定的自我教育目的,因为您的示例代码中没有任何事情是常规(非动态)无法完成的) sql.

更重要的是,在你的最终代码中,如果你需要使用动态 sql 因为你正在为数据库、表等使用变量,你仍然可以避免在动态上下文之外进行这种特殊的比较( sorta,因为变量确实存在于它之外)通过使用方便的 NULLIF() 函数,如下所示:

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

(请注意,上面的行位于动态 sql 语句的内部。它之外的唯一内容是 +@SMTPUID +