根据数据类型将列拆分为行

Split columns into rows based on data type

我有一个table这样的

 parent_id       col1        col2       col3
     101          John         1       9/12/2009 4:33:22 PM
     102          Fid          2       2/10/2005 12:54:01 PM
     103          Smith        3       6/4/2005 10:10:11 PM

col1 是 char
col2 是整数 col1 是时间戳

并且想在第一个 table 的基础上创建第二个 table,示例输出如下

 parent_id   ColName       Charvalue    IntValue  TimeValue
     101     Col1            John         null      null
     101     Col1            Fid          null      null       
     101     Col1            Smith        null      null              
     102     Col2            null          1        null       
     102     Col2            null          2        null       
     102     Col2            null          3        null       
     103     Col3            null         null      9/12/2009 4:33:22 PM
     103     Col3            null         null      2/10/2005 12:54:01 PM
     103     Col3            null         null      6/4/2005 10:10:11 PM

我应该在 MS SQL 服务器中使用 unpivot 来实现吗?

您可以尝试使用 UNION ALL 而不是 unpivot

SELECT 101 parent_id ,col1,NULL col2,NULL col3 
FROM T
UNION ALL
SELECT 102,NULL,col2 ,NULL  
FROM T
UNION ALL
SELECT 103,NULL ,NULL,col3
FROM T

您可以使用 CROSS APPLY (VALUES 进行逆轴旋转,这只需要扫描一次基数 table,因此非常高效

SELECT
  t.parentid,
  v.ColName,
  v.Charvalue,
  v.IntValue,
  v.TimeValue
FROM YourTable t
CROSS APPLY (VALUES
    ('col1', t.col1, NULL, NULL),
    ('col2', NULL, t.col2, NULL),
    ('col3', NULL, NULL, t.col3)
) v(ColName, Charvalue, IntValue, TimeValue);