2017-08-22 14 views
3

現在SQL Server 2008 R2を使用していますが、STUFFステートメントでは問題があります。SQL Server - 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 '[email protected]_Database+'.'[email protected]_Schema+'.'[email protected]_cols+' 
            FOR XML PATH('')),1,1,'') 

私はすでにこのような例のために、いくつかの方法を試してみました:

SET @col_names_2 = 'STUFF((
            SELECT '','' + [COLUMN_NAME] 
            FROM '[email protected]_Database+'.'[email protected]_Schema+'.'[email protected]_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

'EXEC sp_executesqlをN'query」、N'params'、出力パラメータ – lad2025

+0

と@var OUT'あなたはそれをさらに説明していただけますか? – ShortDive

答えて

0

SQL文がSTUFF()で始まらない。それはSELECTで始まります。

私はあなたが欲しい疑う:

SET @col_names_2 = 'SELECT STUFF((SELECT '','' + [COLUMN_NAME] 
            FROM '[email protected]_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 '[email protected]_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); 
+1

それはうまくいかなかった、以下の答えを見てください。 – ShortDive

1

私はゴードン・リノフの答えを試みたが、私はおそらく

SET @col_names_2 = 'SELECT STUFF((
            SELECT '','' + [COLUMN_NAME] 
             FROM '[email protected]_Database+'.'[email protected]_Schema+'.'[email protected]_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 '[email protected]_names_2+' 
         FROM [Test].[dbo].[dbotable]' 

    EXEC(@SQL_5) 
を次のINSERT文に関連するエラーメッセージが表示されましたとしてそれが動作しませんでした

エラーメッセージ:キーワード 'SELECT'の近くに構文が正しくありません。しかし、エラーメッセージの行が間違っています(行2は空です)

2

私はそれを解決したと思います。特に、lad2025のコメントのおかげで解決しました。まだ答えた人のおかげです。

次のソリューションは、私の作品:

SET @col_names_2 = 'SET @col_names_5 = STUFF((
            SELECT '','' + [COLUMN_NAME] 
            FROM '[email protected]_Database+'.'[email protected]_Schema+'.'[email protected]_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 '[email protected]_names_5+' 
         FROM [Test].[dbo].[dbotable]' 

    EXEC(@SQL_5) 
+1

入力が信頼されていて、SQLインジェクションを期待していなくても、メタデータ名をエスケープするには 'QUOTENAME'を使用することを習慣にしてください。 –

関連する問題