2017-11-21 21 views
0

可変数の行に基づいてデータをピボットし、列の総数を正規化された行列を作成するために適用する必要があります。動的SQLを一時テーブルに実行

他の場所の出力を参照する必要があるため、後で使用するためにこの動的SQLを一時テーブルに実行しようとしています。

動的SQLの予想される出力を格納するテーブルを作成しなければならないという頭痛のほかに、出力と同じテーブル構造を作成してEXEC sp_executesql @SQLQueryにしようとすると、追加の列。

メッセージ213、レベル16、状態7、ライン1
列名または指定された値の数のテーブル定義と一致していません。

だから私はここに1を追加し、私は実行するEXEC文を得ることができますが、それは「1」

WHILE @iCount <= (SELECT MAX(RowID) FROM #Input) + 1 

私が間違ってやっている任意のアイデアをラベル列にROWIDを繰り返し、ここに?

詳しい手順:

if OBJECT_ID(N'tempdb..#Input') is not null drop table #Input 
if OBJECT_ID(N'tempdb..#Matrix') is not null drop table #Matrix 

CREATE TABLE #Input 
(
    RowID INT, 
    ColumnID INT, 
    Val FLOAT 
) 

CREATE TABLE #Matrix 
(
    RowID INT IDENTITY(1,1) 
) 

INSERT INTO #Input 
VALUES (1, 1, 0.96), (1, 2, -0.036), (2, 1, -0.034), (2, 2, 0.97) 

DECLARE @iCount INT=1 

--Alter table to include columns that allow for executing dynamic sql into temp table 
WHILE @iCount <= (SELECT MAX(RowID) FROM #Input) + 1  --I don't want to add this third column, but SQL fails otherwise 
BEGIN 
    EXEC('ALTER TABLE #Matrix ADD [' + @iCount +'] FLOAT') 

    SELECT @iCount = @iCount + 1 
END 

--Create dynamic SQL to populate Matrix 
DECLARE @PivotColumns as NVARCHAR(MAX) 
DECLARE @SQLQuery as NVARCHAR(MAX) 

SELECT @PivotColumns=coalesce(@PivotColumns +',','') +QUOTENAME(ColumnID) 
FROM (Select DISTINCT ColumnID FROM #Input) as A 


SELECT * FROM #Input 
Set @SQLQuery= 
    N'Select RowID,' + @PivotColumns + ' 
    FROM #Input 
    PIVOT(MAX(Val) 
     FOR ColumnID IN(' + @PivotColumns + ')) as P' 

--display the dynamic sql results 
EXEC sp_executesql @SQLQuery 

--now place this same sql into the table created above 
INSERT INTO #Matrix EXEC (@SQLQUERY) 

--and display. Why the difference? 
select * from #Matrix 

答えて

0

問題ここでは、#Matrixテーブル定義でIDENTITY(1,1)ました。これを削除すると、プロシージャーは正常に実行されました。

0

は、以下の

... 
CREATE TABLE #Matrix 
(
    RowID INT --IDENTITY(1,1) 
) 
... 
WHILE @iCount <= (SELECT MAX(RowID) FROM #Input) -- + 1 
... 
を行うようにしてください
関連する問題