Сохраненная процедура для отмены поворота - PullRequest
2 голосов
/ 03 августа 2020

У меня есть таблица с этими столбцами:

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     
....

Где код заголовка должен быть именем столбца от 01 до 50, данные должны быть значением этого столбца в 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'. Может кто-нибудь мне помочь?

1 Ответ

2 голосов
/ 03 августа 2020

Проблема с именами столбцов: поскольку они начинаются с di git, вам нужно заключить идентификаторы в кавычки - в 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;
...