首页 > 解决方案 > 如何使用带有空字符串的动态 T-SQL 执行逻辑比较?

问题描述

当执行下面包含的示例代码时,我包含的变量 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

标签: sqlsql-serverdynamic-sql

解决方案


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

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

而不是这个:

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

你应该这样做:

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

最后,我相信您对使用动态 sql 执行此操作有一些自我教育的目的,因为您的示例代码中没有任何事情不能在常规(非动态)sql 中完成。

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

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

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


推荐阅读