2017-08-28 22 views
0

我一直试图在保留两个索引列的情况下使用动态列取消转移大型数据库。我无法将它作为新表格保存为SQL Server Management Studio中的新表格。现在我得到'一个INSERT语句不能包含一个将值赋给一个变量的SELECT语句。'使用Unpivot和动态列创建新表

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); 

回答

1

您需要使动态sql的插入部分成为可能。沿着这些线路的东西。

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

我第一次看到动态的支点。哈哈,开始难以调试。 +1 – scsimon