【问题标题】:Amount of single quotes when running dynamic SQL with variable使用变量运行动态 SQL 时的单引号数量
【发布时间】:2019-01-10 16:08:01
【问题描述】:

我很难在以下 SQL 语句中整理出我应该拥有的 ' 的数量:

declare @sql varchar(max)
declare @LetterID varchar(max) = 'c01as1'
set @sql = 
'SELECT fltr.tency_seq_no FROM OPENQUERY(loopback, 
    ''SET FMTONLY OFF; EXEC BST.[LET].[LETTERBUILD] @LetterCode = 
        ''''\\SVR-QL4APPLIVE\QLSHAREPOINT\LETTERS\DATAFILES\
            '''+@LetterID+'''
        .csv''''
    WITH RESULT SETS (tency_seq_no VARCHAR(255))''
) AS fltr'
exec (@sql)

当前错误:

消息 102,第 15 级,状态 1,第 3 行
'c01as1' 附近的语法不正确

澄清一下,错误是指动态 SQL 中的 @LetterID 变量,而不是在声明参数时

@SQL 的打印

SELECT fltr.tency_seq_no 
FROM OPENQUERY(loopback, 'SET FMTONLY OFF; EXEC BST.[LET].[LETTERBUILD] @LetterCode = ''\\SVR-QL4APPLIVE\QLSHAREPOINT\LETTERS\DATAFILES\'c01as1'.csv''
     WITH RESULT SETS (tency_seq_no VARCHAR(255));'
    ) AS fltr

任何帮助将不胜感激!

【问题讨论】:

  • 无论何时使用动态 sql,您都需要在执行之前打印/选择您的查询。它将很快突出问题所在。
  • @WayneDonaldson 如果您有澄清,请编辑您的问题,而不是模糊 cmets 中的信息。您可以随时修改您的问题。 “编辑”按钮位于左侧,与包含您的用户名的蓝色框平行。
  • 谢谢@ADyson - 修改
  • 嗨@SeanLange,谢谢你的建议,我已经做了一个打印sql,我可以看到输出(添加到OP)。但是,这并没有向我强调问题出在哪里...您现在可以建议查看打印的 sql 吗?
  • '''+@LetterID+''' 应该是' + @LetterID+'

标签: sql-server tsql dynamic-sql


【解决方案1】:

我认为该错误与原始代码中不需要的换行符等有关。试试这个:

DECLARE @sql VARCHAR(MAX);
DECLARE @LetterID VARCHAR(MAX) = 'c01as1';

SET @sql = 'SELECT fltr.tency_seq_no FROM OPENQUERY(loopback, 
    ''SET FMTONLY OFF; EXEC BST.[LET].[LETTERBUILD] @LetterCode = ''''\\SVR-QL4APPLIVE\QLSHAREPOINT\LETTERS\DATAFILES\'
           + @LetterID + '.csv''''
    WITH RESULT SETS (tency_seq_no VARCHAR(255))''
) AS fltr';

EXEC (@sql);

【讨论】:

  • 谢谢@Thailo
【解决方案2】:

几个月前,当我遇到这个困难时,我创建了一个函数,可以对动态 SQL 的引号执行双倍运算。这个标量函数可以执行此任务,而不是每次手动搜索字符串以查找需要加倍的引号。这可以防止在将来执行修改(例如添加其他变量以及提高可读性)时可能导致脚本混乱。

功能如下:

CREATE FUNCTION dbo.fn_duplicateQuotes
    (@string varchar(max),
    @level int)
RETURNS varchar(max)
AS
BEGIN
    /*Doubles-up quotation marks for nested dynamic SQL
      level can be set greater than 1 to add additional doubled-up quotes
      for further nested dynamic SQL*/

    /*Double up quotes*/
        set @string = REPLACE(@string, '''', REPLICATE('''', (@level) * 2))

    /*Return Value*/
        return @string
END

动态SQL如下:

declare @SQL nvarchar(max)
declare @LetterID varchar(max) = 'c01as1'

set @SQL = 'SET FMTONLY OFF; EXEC BST.[LET].[LETTERBUILD] @LetterCode = 
              ''\\SVR-QL4APPLIVE\QLSHAREPOINT\LETTERS\DATAFILES\' + @LetterID + '.csv''
             WITH RESULT SETS (tency_seq_no VARCHAR(255));'

set @SQL = 'SELECT fltr.tency_seq_no FROM OPENQUERY(loopback,
        ''' + dbo.fn_duplicateQuotes(@SQL, 1) + '''
        ) AS fltr'

print @SQL
exec (@SQL)

@SQL 返回的打印:

SELECT fltr.tency_seq_no FROM OPENQUERY(loopback,
        'SET FMTONLY OFF; EXEC BST.[LET].[LETTERBUILD] @LetterCode = 
              ''\\SVR-QL4APPLIVE\QLSHAREPOINT\LETTERS\DATAFILES\c01as1.csv''
             WITH RESULT SETS (tency_seq_no VARCHAR(255));'
        ) AS fltr

【讨论】:

  • 谢谢@solutionist 我已经采纳了这个想法! :)
猜你喜欢
  • 2020-01-16
  • 1970-01-01
  • 2013-08-21
  • 1970-01-01
  • 1970-01-01
  • 2022-01-20
  • 2020-04-15
  • 2012-06-24
  • 1970-01-01
相关资源
最近更新 更多