[英]SQL Server convert flat table to attribute based structure
我有一個從Excel電子表格導入的數據的平面表。
tbl_ProductsImport
----------------------------------------------------------------------------------
ProductId | Name | Description | Attribute1 | Attribute2 | Attribute3 | Attribute4 etc...
----------------------------------------------------------------------------------
12345 P1 Some desc.. x x x
12346 P2 Some desc.. x
12347 P3 Some desc.. x x x x
12348 P4 Some desc.. x x
我想將其轉換為以下表結構...
tbl_Products
------------------------------
ProductId (pk) | Name | Description
tbl_Attributes
----------------------------------------------
AttributeId (pk) | Name (derrived from column)
tbl_ProductAttributes
----------------------
ProductId (fk) | AttributeId (fk)
所以我問,我將如何寫一個聲明來做到這一點?
編輯:這將是計划數據導入作業的一部分,該作業將在執行之前截斷所有現有數據。
嗯 這行得通嗎? 討厭的討厭的動態SQL,但有時必須完成。
INSERT tbl_Products
SELECT ProductId, Name, Description
FROM tbl_ProductsImport
INSERT tbl_Attributes (Name)
SELECT c.name
FROM sys.sysobjects o
JOIN sys.syscolumns c ON o.id = c.id
WHERE o.name = 'tbl_ProductsImport'
AND c.name LIKE 'Attribute%'
DECLARE @DynamicSQL VARCHAR(MAX)
SET @DynamicSQL = ''
DECLARE @AttributeId INT
DECLARE @AttributeName NVARCHAR(255)
SELECT @AttributeId = MIN(AttributeId)
FROM tbl_Attributes
WHILE (@AttributeId <= (SELECT MAX(AttributeId) FROM tbl_Attributes))
BEGIN
SELECT @AttributeName = Name
FROM dbo.tbl_Attributes
WHERE AttributeId = @AttributeId
SELECT @DynamicSQL =
'INSERT tbl_ProductAttributes
SELECT ProductId, ' + CONVERT(VARCHAR, @AttributeId) + '
FROM tbl_ProductsImport
WHERE ' + @AttributeName + ' = 1'
EXEC (@DynamicSQL)
SET @AttributeId = @AttributeId + 1
END
假定tbl_ProductsImport中的Attributes的值為BIT。 尚未嘗試過,因此可能會導致超級失敗。
吉姆
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.