sql - 如何使用带有空字符串的动态 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
解决方案
您不应该在比较检查中将单引号加倍。
此外,正如 Grambo 指出的那样,如果您的动态 sql 字符串中需要 NULL,您需要连接字符串值'NULL'
而不是实际连接NULL
。
而不是这个:
'+ (SELECT IIF ( @SMTPUID != '''', ''''+ @SMTPUID +'''', NULL)) + ',
你应该这样做:
'+ (SELECT IIF ( @SMTPUID != '', ''''+ @SMTPUID +'''', 'NULL')) + ',
最后,我相信您对使用动态 sql 执行此操作有一些自我教育的目的,因为您的示例代码中没有任何事情不能在常规(非动态)sql 中完成。
更重要的是,在您的最终代码中,如果您需要使用动态 sql,因为您正在为数据库、表等使用变量,您仍然可以避免在动态上下文之外进行这种特定的比较(排序,因为变量确实存在于它)通过使用方便的 NULLIF() 函数,如下所示:
NULLIF('''+@SMTPUID +''',''''),
(请注意,上面的行是动态 sql 语句的内部。唯一在它之外的是+@SMTPUID +
推荐阅读
- c# - System.InvalidOperationException:“没有为类型 'Microsoft.AspNetCore.Hosting.Server.IServer' 注册服务。”
- c# - 从 pgadmin 到 c# Visual Studio 获取数据时出错
- javascript - 多个关键帧,但似乎没有运行
- java - FeignErrorDecoder 中调用的 response.body.asReader() 导致 IOException: stream is closed
- python - DEAP中具有多个权重的健身功能
- ruby-on-rails - Nginx + Puma + Sidekiq Web 界面未显示 CSS 样式
- java - 在字符串递归中将数字向左移动
- node.js - 无法在 Windows 上使用 npx grunt 构建应用程序
- python - python - 如何使用python中的word tokenize函数删除列表中的编号?我得到了输出,但我需要没有数字
- python - 在 Python 中实现函数需要帮助