可変数の行に基づいてデータをピボットし、列の総数を正規化された行列を作成するために適用する必要があります。動的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