如何使用带有空字符串的动态T-SQL执行逻辑比较?
在执行下面包含的示例代码时,使用我包含的变量,其中name/pw设置为空字符串(“”),就我所知,iif比较运算符在任何情况下都不会返回null。我是否正确执行此检查?我是动态SQL新手,正在尝试转换我编写的一些实用程序脚本,以便更好地理解。我甚至还没有开始尝试连接@SMTPPORT和@SMTPSSL,而不是25/0,因为这一错误对这一行没有意义如何使用带有空字符串的动态T-SQL执行逻辑比较?,sql,sql-server,dynamic-sql,Sql,Sql Server,Dynamic Sql,在执行下面包含的示例代码时,使用我包含的变量,其中name/pw设置为空字符串(“”),就我所知,iif比较运算符在任何情况下都不会返回null。我是否正确执行此检查?我是动态SQL新手,正在尝试转换我编写的一些实用程序脚本,以便更好地理解。我甚至还没有开始尝试连接@SMTPPORT和@SMTPSSL,而不是25/0,因为这一错误对这一行没有意义 -- SMTP Settings if desired; leave blank if you wish to use defaults for tr
-- 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,因为变量确实存在于动态上下文之外),方法是使用方便的dandy NULLIF()函数,如下所示:
NULLIF('''+@SMTPUID +''',''''),
(请注意,上面的一行在动态sql语句内部。唯一在动态sql语句外部的是
+@SMTPUID++
在比较检查中不应将单引号加倍。)
此外,正如Grambo指出的,如果希望动态sql字符串中包含NULL,则需要将字符串值'NULL'
串联起来,而不是实际串联NULL
与此相反:
'+ (SELECT IIF ( @SMTPUID != '''', ''''+ @SMTPUID +'''', NULL)) + ',
您应该这样做:
'+ (SELECT IIF ( @SMTPUID != '', ''''+ @SMTPUID +'''', 'NULL')) + ',
最后,我相信您在使用动态sql时会有一些自我教育的目的,因为在您的示例代码中没有任何事情是在常规(非动态)sql中无法完成的
更重要的是,在最后的代码中,如果您需要使用动态sql,因为您正在为数据库、表等使用变量,您仍然可以避免在动态上下文之外进行这种特殊的比较(sorta,因为变量确实存在于动态上下文之外),方法是使用方便的dandy NULLIF()函数,如下所示:
NULLIF('''+@SMTPUID +''',''''),
(请注意,上面这一行在动态sql语句内部。唯一在它外部的是
+@SMTPUID+
使用PRINT@SmtpCMD检查动态sql,并根据需要进行更改。再见Sean,您说过“iif比较运算符没有返回null
”,这是不正确的。问题是NULL
与empty string
不一样。empty string'
是一个值,而NULL不是一个值。这些情况的解决方案是简单地比较ISNULL(列名称')
,这意味着任何空值都将替换为空值string@RonenAriely我对你的评论投了赞成票,但后来意识到他将NULL作为IIF()的返回值对于false——Tab锁定了这一个,我想。嗨@JeffBreadner——我很感激!我使用SELECT来识别代码,但在识别如何解决问题代码时遇到了困难。我将尝试Tab的以下测试。(编辑:我不知道enter会发布此消息)——Dave是正确的,因为NULL是IIF()的返回值未在比较运算符中检查。请使用PRINT@SmtpCMD检查动态SQL,并根据需要进行更改。再见Sean,您说过“iif比较运算符未返回null
”,这是不正确的。问题是NULL
与empty string
不一样。empty string'
是一个值,而NULL不是一个值。这些情况的解决方案是简单地比较ISNULL(列名称')
,这意味着任何空值都将替换为空值string@RonenAriely我对你的评论投了赞成票,但后来意识到他将NULL作为IIF()的返回值对于false——Tab锁定了这一个,我想。嗨@JeffBreadner——我很感激!我使用SELECT来识别代码,但在识别如何解决问题代码时遇到了困难。我将尝试Tab的以下测试。(编辑:我不知道enter会发布此消息)——Dave是正确的,因为NULL是IIF()的返回值未在比较运算符中检查和。这仍然不适用于NULL,因为您将@SMTPUID
与空字符串进行比较。您应该使用ISNULL(@SMTPUID“”)
而不是@SMTPUID
事实上,我认为您需要以下内容,其中NULL位于单引号内,因为连接到NULL将使整个表达式为NULL。“+(选择IIF(\@SMTPUID!=”、“+\@SMTPUID+”、“NULL”))“+”,实际上@grambo25是正确的。。我将进行相应的编辑。@Ronenariley再次仔细阅读这个问题。你的阅读方式与我不同,我很确定我的阅读方式是正确的。OP是问如何将值与空字符串进行比较。问题不是问如何将变量值@SMTPUID
与NULL进行比较。我承认添加ISNULL
不会损害任何东西(除了一点性能开销),但这超出了OP的要求。没错,他想将@SMTPUID与空字符串进行比较,但当变量@SMTPUID为NULL时,则条件@SMTPUID=''
为false,因为NULL与空字符串不同。OP提到他从不将NULL与IIF进行比较,这是错误的。他试图将@SMTPUID与空字符串进行比较,并当@SMTPUID为NULL时,他得到了false。他应该使用ISNULL(@SMTPUID,”)
进行此操作,如果他想在与空字符串进行比较时得到带有NULL的行……在任何情况下,我看到问题已更改,因此我