I have a table with these columns:
x
surname name birthdate id_doc role 01 02 50
Vardy Jack 19870215 1234 'emp' 20200110 20200527 20200610
Where fields from 01 to 50 are dates. I need to have a table like this:
surname name birthdate id_doc role title_code data
Vardy Jack 19870215 1234 'emp' 01 20200110
Vardy Jack 19870215 1234 'emp' 02 20200527
.
Where title code should be the column name from 01 to 50, data should be the value of that column in mytable
I did this stored procedure by looking in older questions:
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
but I’m getting a syntax error near '.01'
. Could someone help me please?
Advertisement
Answer
The problem is with the column names: since they start with a digit, you need to quote the identifiers – in SQL Server, you need to use square brackets. You can take care of that this in the first query.
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;