Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 选择行数据作为ColumnName和Value_Sql Server_Sql Server 2008_Pivot Table_Dynamic Pivot - Fatal编程技术网

Sql server 选择行数据作为ColumnName和Value

Sql server 选择行数据作为ColumnName和Value,sql-server,sql-server-2008,pivot-table,dynamic-pivot,Sql Server,Sql Server 2008,Pivot Table,Dynamic Pivot,我有一个历史记录表,需要以ColumnName、ColumnValue的形式从该表中选择值。我使用的是SQLServer2008,我不确定是否可以使用PIVOT函数来实现这一点。下面是我需要完成的一个简化示例: 这就是我所拥有的: 该表的架构是 CREATE TABLE TABLE1 (ID INT PRIMARY KEY, NAME VARCHAR(50)) CREATE TABLE TABLE1_HISTORY( ID INT, NAME VARCHAR(50),

我有一个历史记录表,需要以ColumnName、ColumnValue的形式从该表中选择值。我使用的是SQLServer2008,我不确定是否可以使用PIVOT函数来实现这一点。下面是我需要完成的一个简化示例:

这就是我所拥有的:

该表的架构是

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))
“history”表的架构是

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))
以下是表1_历史中的数据

ID  NAME        TYPE        TRANSACTION_ID
1    Joe         INSERT      a
1    Bill        UPDATE      b
1    Bill        DELETE      c
我需要将表1_历史记录中的数据提取为以下格式:

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

除了升级到Enterprise Edition并利用内置的更改跟踪功能外,您对完成此任务有何建议?

您可以尝试使用
联合

测试数据

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

这可以通过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

是的,但是实际表中有很多列,所以我希望不必为每一列执行select语句,因为性能很差。执行计划告诉您什么?很多表格扫描?添加覆盖索引不会加快速度吗?