运行 dynamic SQL with variable 时的单引号数量
Amount of single quotes when running dynamic SQL with variable
我真的很难整理 '
我应该在以下 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)
当前错误:
Msg 102, Level 15, State 1, Line 3
Incorrect syntax near '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
动态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 returns:
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 声明中的数量:
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)
当前错误:
Msg 102, Level 15, State 1, Line 3
Incorrect syntax near '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
动态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 returns:
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