簡體   English   中英

SQL Server將平面表轉換為基於屬性的結構

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM