我目前正在使用SQL Server 2008 R2,而且我在使用STUFF语句时遇到了困难。
以下声明可以正常使用:
SET @col_names_2 = STUFF((
SELECT ',' + [COLUMN_NAME]
FROM test.dbo.common_columns
FOR XML PATH('')),1,1,'')
但我想在STUFF语句中使用变量,如下所示:
SET @col_names_2 = STUFF((
SELECT ',' + [COLUMN_NAME]
FROM '+@DBO_Database+'.'+@DBO_Schema+'.'+@common_cols+'
FOR XML PATH('')),1,1,'')
我已经尝试了几种方法,例如:
SET @col_names_2 = 'STUFF((
SELECT '','' + [COLUMN_NAME]
FROM '+@DBO_Database+'.'+@DBO_Schema+'.'+@common_cols+'
FOR XML PATH('''')),1,1,'''')'
PRINT(@col_names_2)
EXEC(@col_names_2)
PRINT语句给出了以下结果:
STUFF((
SELECT ',' + [COLUMN_NAME]
FROM test.dbo.common_columns
FOR XML PATH('')),1,1,'')
如何将此STUFF语句的输出分配给变量?我已经在批处理语句中使用SET语句尝试了它,但这也不起作用。 目前我收到以下错误消息:
关键字“FOR”附近的语法不正确。
我做错了什么?
答案 0 :(得分:2)
我想我已经解决了,特别感谢lad2025的评论。还要感谢所有回答的人。
以下解决方案适合我:
SET @col_names_2 = 'SET @col_names_5 = STUFF((
SELECT '','' + [COLUMN_NAME]
FROM '+@DBO_Database+'.'+@DBO_Schema+'.'+@common_cols+'
FOR XML PATH('''')),1,1,'''')'
PRINT(@col_names_2)
--EXEC(@col_names_2)
EXECUTE sp_executesql @col_names_2, N'@col_names_5 nvarchar(max) OUTPUT', @col_names_5 OUTPUT
PRINT @col_names_5
SET @SQL_5 = 'INSERT INTO [Test].[clean].[cleantable]
SELECT '+@col_names_5+'
FROM [Test].[dbo].[dbotable]'
EXEC(@SQL_5)
答案 1 :(得分:1)
我尝试了Gordon Linoff的答案但是这没有用,因为我收到的错误信息可能与后面的INSERT语句有关
SET @col_names_2 = 'SELECT STUFF((
SELECT '','' + [COLUMN_NAME]
FROM '+@DBO_Database+'.'+@DBO_Schema+'.'+@common_cols+'
FOR XML PATH('''')),1,1,'''')'
PRINT(@col_names_2)
EXEC SP_EXECUTESQL @col_names_2
SET @SQL_5 = 'INSERT INTO [Test].[clean].[cleantable]
SELECT '+@col_names_2+'
FROM [Test].[dbo].[dbotable]'
EXEC(@SQL_5)
错误消息显示:关键字'SELECT'附近的语法不正确。但错误消息的行不正确(第2行为空)
答案 2 :(得分:0)
SQL语句不以STUFF()
开头。它以SELECT
开头。
我怀疑你想要:
SET @col_names_2 = 'SELECT STUFF((SELECT '','' + [COLUMN_NAME]
FROM '+@DBO_Database + '.' + @DBO_Schema + '.' + @common_cols+'
FOR XML PATH('''')
), 1, 1, '''')' ;
PRINT(@col_names_2);
EXEC SP_EXECUTESQL @col_names_2;
这使用sp_executesql
而不是exec
- 它更适合执行动态SQL。它还允许您将输出值分配给变量。
将值赋给变量:
DECLARE @sql NVARCHAR(MAX);
DECLARE @cols NVARCHAR(MAX);
SET @sql = 'SELECT @cols = STUFF((SELECT '','' + [COLUMN_NAME]
FROM '+@DBO_Database + '.' + @DBO_Schema + '.' + @common_cols+'
FOR XML PATH('''')
), 1, 1, '''')' ;
PRINT(@sql);
EXEC SP_EXECUTESQL @sql,
N'@cols NVARCHAR(MAX) OUTPUT',
@cols = @cols;
PRINT(@cols);