【问题标题】:Stored procedure to unpivot要取消透视的存储过程
【发布时间】:2020-08-03 09:30:57
【问题描述】:

我有一个包含这些列的表格:

surname  name  birthdate  id_doc  role   01         02       ... 50
Vardy    Jack  19870215    1234   'emp'  20200110   20200527     20200610

从 01 到 50 的字段是日期。我需要一张这样的桌子:

surname  name  birthdate  id_doc  role   title_code   data
Vardy    Jack  19870215    1234   'emp'     01        20200110   
Vardy    Jack  19870215    1234   'emp'     02        20200527     
....

其中title code应该是01到50的列名,data应该是mytable中该列的值

我通过查看较早的问题来完成此存储过程:

CREATE PROCEDURE proc
AS
    BEGIN
    DECLARE @UnpivotList NVARCHAR(MAX) = N'';
    SELECT @UnpivotList = CONCAT(@UnpivotList, ',(''', c.name, ''', fe.', c.name, ')')
    FROM 
       sys.columns c
    WHERE 
       c.object_id = OBJECT_ID('mytable')
       AND c.column_id > 5;

    DECLARE @sql NVARCHAR(MAX) = CONCAT(N'
    SELECT 
       fe.surname,
       fe.name,
       fe.birthdate,
       fe.id_doc,
       fe.role,
       ul.title_code,
       ul.Data
    FROM 
       mytable fe
       CROSS APPLY ( VALUES ', STUFF(@UnpivotList, 1, 1, ''), N') ul (title_code, Data)');
    EXEC sys.sp_executesql @sql;
END 

但我在'.01' 附近遇到语法错误。有人可以帮帮我吗?

【问题讨论】:

    标签: sql sql-server string stored-procedures unpivot


    【解决方案1】:

    问题在于列名:由于它们以数字开头,因此您需要引用标识符 - 在 SQL Server 中,您需要使用方括号。您可以在第一个查询中处理这一点。

    SELECT @UnpivotList = CONCAT(@UnpivotList, ',(''', c.name, ''', fe.[', c.name, '])')
    FROM sys.columns c                                               --^    here    ^ --
    WHERE 
       c.object_id = OBJECT_ID('mytable')
       AND c.column_id > 5;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-20
      • 2014-07-03
      相关资源
      最近更新 更多