Данные отчетов, которые мы получаем от аналитиков, представлены в формате таблицы с произвольной структурой.Все, что мы знаем, это то, что в каждой строке есть столбец CustomerId
.Но о других мы не знаем и можем каждый раз меняться.
Система назначения, которая получает эти данные, работает только в формате ключ / значение, поэтому нам необходимо преобразовать таблицы отчета в ключ / значение.
Так, если, например, исходная таблица отчета имеет следующую структуру:
CREATE TABLE [dbo].[SampleSourceTable](
[CustomerId] [bigint] NULL,
[Column1] [nchar](10) NULL,
[Column2] [int] NULL,
[Column3] [datetime] NULL
) ON [PRIMARY]
GO
INSERT [dbo].[SampleSourceTable] ([CustomerId], [Column1], [Column2], [Column3]) VALUES (1, N'aaa', 123, CAST(N'2019-01-01T00:00:00.000' AS DateTime))
GO
INSERT [dbo].[SampleSourceTable] ([CustomerId], [Column1], [Column2], [Column3]) VALUES (2, N'bbb', 456, CAST(N'2018-01-01T00:00:00.000' AS DateTime))
GO

Мы хотели бы, чтобы эти данные были преобразованыв следующую структуру:
CREATE TABLE [dbo].[SampleDestinationTable](
[CustomerId] [bigint] NULL,
[Attribute] [nvarchar](255) NULL,
[Value] [nvarchar](max) NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
INSERT [dbo].[SampleDestinationTable] ([CustomerId], [Attribute], [Value]) VALUES (1, N'Column1', N'aaa')
GO
INSERT [dbo].[SampleDestinationTable] ([CustomerId], [Attribute], [Value]) VALUES (1, N'Column2', N'123')
GO
INSERT [dbo].[SampleDestinationTable] ([CustomerId], [Attribute], [Value]) VALUES (1, N'Column3', N'2019-01-01 00:00:00.000')
GO
INSERT [dbo].[SampleDestinationTable] ([CustomerId], [Attribute], [Value]) VALUES (2, N'Column1', N'bbb')
GO
INSERT [dbo].[SampleDestinationTable] ([CustomerId], [Attribute], [Value]) VALUES (2, N'Column2', N'456')
GO
INSERT [dbo].[SampleDestinationTable] ([CustomerId], [Attribute], [Value]) VALUES (2, N'Column3', N'2018-01-01 00:00:00.000')
GO

Однако здесь проблема заключается в том, что исходная таблица отчета не имеет фиксированной структуры.
Сначала я думал о том, чтобы пройти каждую строку с помощью курсора, а затем с помощью вложенного курсора пройти через все столбцы в этой строке.Но, по-видимому, не существует способа обработки строки с неизвестной структурой с использованием курсоров .Итак, на данный момент мне интересно, возможно ли это с помощью PIVOT / UNPIVOT.Но опять же, я думаю, что им также требуется список столбцов.
Я использую SQL Server 2017.
Как преобразовать данные с неизвестной структурой?