SQL Server - STUFF语句中的变量

时间:2017-08-22 12:12:41

标签: sql sql-server

我目前正在使用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”附近的语法不正确。

我做错了什么?

3 个答案:

答案 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);