2010-05-11 44 views
1

我有一個歷史表,我需要從ColumnName,ColumnValue窗體中的這個表中選擇值。我正在使用SQL Server 2008,我不確定是否可以使用PIVOT函數來完成此操作。下面是什麼,我需要完成一個簡單的例子:選擇行數據作爲ColumnName和值

這是我有:

表的模式是

CREATE TABLE TABLE1 (ID INT PRIMARY KEY, NAME VARCHAR(50)) 

「歷史記錄」表的模式是

CREATE TABLE TABLE1_HISTORY(
    ID INT, 
    NAME VARCHAR(50), 
    TYPE VARCHAR(50), 
    TRANSACTION_ID VARCHAR(50)) 

這裏是來自TABLE1_HISTORY的數據

ID NAME  TYPE  TRANSACTION_ID 
1 Joe   INSERT  a 
1 Bill  UPDATE  b 
1 Bill  DELETE  c 

我需要從TABLE1_HISTORY數據提取到這種格式:

TransactionId Type  ColumnName ColumnValue 
a    INSERT  ID   1 
a    INSERT  NAME  Joe 
b    UPDATE  ID   1 
b    UPDATE  NAME  Bill 
c    DELETE  ID   1 
c    DELETE  NAME  Bill 

除了升級到企業版,並利用內置的更改跟蹤功能,什麼是你完成這個任務的建議嗎?

回答

1

你可以嘗試使用UNION

測試數據

DECLARE @TABLE1_HISTORY TABLE (
    ID INT, 
    NAME VARCHAR(50), 
    TYPE VARCHAR(50), 
    TRANSACTION_ID VARCHAR(50)) 


INSERT INTO @TABLE1_HISTORY 
SELECT 1, 'Joe', 'INSERT', 'a' 
UNION ALL SELECT 1, 'Bill', 'UPDATE', 'b' 
UNION ALL SELECT 1, 'Bill', 'DELETE', 'c' 

SQL語句

SELECT [TransactionID] = Transaction_ID 
      , [Type] = [Type] 
      , [ColumnName] = 'ID' 
      , [ColumnValue] = CAST(ID AS VARCHAR(50)) 
FROM  @Table1_History 
UNION ALL 
SELECT [TransactionID] = Transaction_ID 
      , [Type] = [Type] 
      , [ColumnName] = 'NAME' 
      , [ColumnValue] = [Name] 
FROM  @Table1_History 
ORDER BY TransactionID 
      , ColumnName 
+0

是的,但是實際表中有很多列,所以我希望不必爲每一列執行一條select語句,因爲性能很糟糕。 – Bobcat1506 2010-05-11 14:48:48

+0

執行計劃告訴你什麼?很多桌面掃描?不添加覆蓋索引會加快速度嗎? – 2010-05-11 17:40:14

1

這可以在SQL Server中的UNPIVOT函數來完成:

select transaction_id, 
    type, 
    ColumnName, 
    ColumnValue 
from 
(
    select transaction_id, 
    type, 
    cast(id as varchar(50)) id, 
    name 
    from TABLE1_HISTORY 
) src 
unpivot 
(
    ColumnValue 
    for ColumnName in (ID, Name) 
) un