Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用带有空字符串的动态T-SQL执行逻辑比较?_Sql_Sql Server_Dynamic Sql - Fatal编程技术网

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

如何使用带有空字符串的动态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

在执行下面包含的示例代码时,使用我包含的变量,其中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,因为变量确实存在于动态上下文之外),方法是使用方便的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的行……在任何情况下,我看到问题已更改,因此我