Sql server 使用变量运行动态SQL时的单引号数量
我在整理以下SQL语句中应包含的Sql server 使用变量运行动态SQL时的单引号数量,sql-server,tsql,dynamic-sql,Sql Server,Tsql,Dynamic Sql,我在整理以下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-Q
“
数量时遇到了一个真正的难题:
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
任何帮助都将不胜感激 我认为这个错误与原始代码中不需要的换行符等有关。请尝试以下方法:
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);
几个月前,当我遇到这个困难时,我创建了一个函数,该函数将对动态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
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如下所示:
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
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
无论何时使用动态sql,都需要在执行查询之前打印/选择查询。它会很快突出问题所在。@WayneDonaldson如果您有澄清,请编辑您的问题,而不是在评论中模糊信息。你可以随时修改你的问题。“编辑”按钮位于左侧,与包含用户名的蓝色框平行。谢谢@ADyson-amendehi@SeanLange,谢谢你的建议,我已经完成了打印sql,我可以看到输出(添加到OP中)。然而,这并没有向我强调问题在哪里。。。您还可以建议现在查看打印的sql吗?
'+@LetterID+'
应该是'+@LetterID+'
谢谢@thail谢谢@solutionist我已经接受了这个想法!)