在执行下面包含的示例代码时,使用我所包含的变量(其中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
答案 0 :(得分:2)
您不应该在比较检查中将单引号加倍。
而且,正如Grambo指出的那样,如果要在动态sql字符串中使用NULL,则需要连接字符串值'NULL'
而不是实际连接NULL
。
代替此:
'+ (SELECT IIF ( @SMTPUID != '''', ''''+ @SMTPUID +'''', NULL)) + ',
您应该这样做:
'+ (SELECT IIF ( @SMTPUID != '', ''''+ @SMTPUID +'''', 'NULL')) + ',
最后,我相信您对动态sql进行此操作具有一定的自我教育目的,因为示例代码中没有其他事情可以在常规(非动态)sql中完成。
最后,即使在最后的代码中,如果由于要使用数据库,表等变量而需要使用动态sql,您仍然可以避免在动态上下文之外进行这种特殊的比较(排序,因为变量确实存在于其外部),例如使用方便的NULLIF()函数:
NULLIF('''+@SMTPUID +''',''''),
(请注意,上面的行在动态sql语句的内部。唯一在它外面的是+@SMTPUID +