2017-08-28 6 views
0

Ich habe versucht, eine große Datenbank mit dynamischen Spalten zu deaktivieren, während zwei indizierte Spalten beibehalten. Ich kann es nicht als neue Tabelle in SQL Server Management Studio als neue Tabelle speichern. Im Moment bekomme ich 'Eine INSERT-Anweisung kann keine SELECT-Anweisung enthalten, die einer Variablen Werte zuweist.'Erstellen Sie eine neue Tabelle mit Unpivot und dynamischen Spalten

DECLARE @cols AS NVARCHAR(MAX); 
DECLARE @query AS NVARCHAR(MAX); 

create table pivot_columns ([Prime Item Nbr] NVARCHAR(MAX), [Store Nbr] NVARCHAR(MAX)) 


insert into pivot_columns 

select @cols = STUFF((SELECT distinct ',' + 
         QUOTENAME(column_name) 
         FROM information_schema.columns 
         WHERE table_name = 'POSSalesMicro' 
         AND COLUMN_NAME <> 'Prime Item Nbr' 
         AND COLUMN_NAME <> 'Store Nbr' 
         FOR XML PATH(''), TYPE 
        ).value('.', 'NVARCHAR(MAX)') 
         , 1, 1, ''); 




SELECT @query = 'WITH Unpivoted 
       AS 
       (
        SELECT [Prime Item Nbr], [Store Nbr], columns, value 
        FROM POSSalesMicro 
        UNPIVOT 
        (
         columns 
         FOR value IN('+ @cols + ') 
        ) AS u 
       ) 
       SELECT 
        [Prime Item Nbr], 
        [Store Nbr], 
        columns, 
        CAST(CASE WHEN value LIKE ''% POS Sales'' THEN REPLACE(value,''POS Sales'', '''') 
         WHEN value LIKE ''LR%'' THEN REPLACE(value,''LR '', '''') 
        END AS INT) AS WMWeek 
       FROM Unpivoted'; 


EXECUTE(@query); 

Antwort

1

Sie müssten den Einfügeteil Ihres dynamischen SQL machen. Etwas in dieser Richtung.

select @cols = STUFF((SELECT distinct ',' + 
         QUOTENAME(column_name) 
         FROM information_schema.columns 
         WHERE table_name = 'POSSalesMicro' 
         AND COLUMN_NAME <> 'Prime Item Nbr' 
         AND COLUMN_NAME <> 'Store Nbr' 
         FOR XML PATH(''), TYPE 
        ).value('.', 'NVARCHAR(MAX)') 
         , 1, 1, ''); 

SELECT @query = 'WITH Unpivoted 
       AS 
       (
        SELECT [Prime Item Nbr], [Store Nbr], columns, value 
        FROM POSSalesMicro 
        UNPIVOT 
        (
         columns 
         FOR value IN('+ @cols + ') 
        ) AS u 
       ) 
       insert into pivot_columns (' + @cols + ') 
       SELECT 
        [Prime Item Nbr], 
        [Store Nbr], 
        columns, 
        CAST(CASE WHEN value LIKE ''% POS Sales'' THEN REPLACE(value,''POS Sales'', '''') 
         WHEN value LIKE ''LR%'' THEN REPLACE(value,''LR '', '''') 
        END AS INT) AS WMWeek 
       FROM Unpivoted'; 

exec sp_executesql @query 
+1

Zum ersten Mal habe ich dynamische mit Pivot gesehen. Beginnt an diesem Punkt hart zu debuggen, haha. +1 – scsimon

Verwandte Themen