2017-12-06 3 views
0
DECLARE @newcolumns VARCHAR(2000); 

WITH cte AS 
(
    SELECT 
     REPLACE(REPLACE(DateOut, ']', ''), '[', '') DateOut 
    FROM 
     #Columns 
) 
SELECT 
    @newcolumns = COALESCE(@newcolumns + ',' + '[' + DateOut + '] REAL', 
    '[' + DateOut + '] REAL') 
FROM 
    cte 

CREATE TABLE #newtable 
(
    Area NVARCHAR(50), 
    EqpType NVARCHAR(50), 
    @newcolumns 
) 

私は私が別の変数のように使用してみましたvarchar型の変数とテーブルの列を宣言し

[dec-1] real, [dec-2] real, [dec-3] real 

のようなものを返す@newcolumns変数このコードを持っている:

DECLARE @sql VARCHAR(4000) 
SET @sql = ' 

CREATE TABLE #newtable 
(
    Area NVARCHAR(50), 
    EqpType NVARCHAR(50), ' + @newcolumns + ') 
INSERT INTO #newtable 
SELECT Area,EqpType,'[email protected]+' 
FROM #littletable 
PIVOT (MAX(Metric) FOR DateOut IN ('[email protected]+')) Z 
GROUP BY Area,EqpType 
ORDER BY AREA' EXEC (@sql) 

そして、それを本当にうまくいっていますが、別の変数を使用せずに同じことを行う方法はありますか? @sqlのように?

+0

なぜ大括弧を削除しますか? 'SELECT REPLACE(REPLACE(DateOut、 '' '、' ')、' ['、' ')DateOut FROM#Columns'を追加してそれらを追加しますか? – scsimon

+1

select intoを使用すると、これをもっと簡単にすることができます。あなたはこれらすべてのフープを飛び越える必要はありません。 #littletableから* into #newtableを選択します。しかし、これは質問.....なぜあなたはあなたの一時テーブルの2番目のコピーを持っている必要がありますか?これは本当にXY問題の外観を持っています。 –

+1

@scsimon、私が考えることができる1つの理由は、 'DateOut'のいくつかの値が角括弧を持つことがあり、そうでないものがあるかもしれないということです。それらがあればそれらを置き換えることでそれらを均一にすることができるので、それらが再び追加されたときにはそれぞれが1組のブラケットしか持たない。 –

答えて

1

いいえありません。列名に変数を使用するには、変数@sqlを使用して動的SQLを使用する必要があります。