Столбцы SQL в строки

Из моей таблицы базы данных (Клиент) мне нужно выбрать одну запись и отобразить результат, чередуя столбцы со строками.

EG: фактический результат

| ID | Name | Age |
| 1  | Tom  | 25  |

ожидаемый результат

| Name | Value|
| ID   | 1    |
| Name | Tom  |
| Age  | 25   |

Другие детали:

  1. Таблица клиентов имеет разное количество столбцов в разных базах данных
  2. Мне нужно сделать это внутри функции (поэтому я не могу использовать динамические запросы, UNPIVOT)

Пожалуйста, посоветуйте мне.

1 ответ

Это использует CROSS APPLY со значениями для выполнения разворота

--Set up test data
CREATE TABLE dbo.TEST(ID INT IDENTITY (1,1),Name VARCHAR(20),Age TINYINT)

INSERT INTO  dbo.TEST VALUES
('Shaggy',32)
,('Fred',28)
,('Velma',26)
,('Scooby',7)



DECLARE @table VARCHAR(255) = 'Test'
DECLARE @schema VARCHAR(255) = 'dbo'
DECLARE @ID INT = 2

--Create a VALUES script for the desired table
DECLARE @col VARCHAR(1000)
SELECT
    @col = COALESCE(@col,'') + '(''' + c.name + ''' ,CAST(A.[' + c.name + '] AS VARCHAR(20))),' 
FROM
    sys.objects o
        INNER JOIN sys.columns c
            ON
            o.object_id = c.object_id
WHERE
    o.name = @table
    AND
    SCHEMA_NAME(o.schema_id) = @schema
ORDER BY
    c.column_id

--Remove trailing ,
SET @col = LEFT(@col,LEN(@col)-1)

--Build Script for unpivoting data.
DECLARE @str VARCHAR(2000) = '
SELECT
    CAST(C.Col AS VARCHAR(20)) AS [Name]
    ,CAST(C.Val AS VARCHAR(20)) AS [Value]
FROM
    [' + @schema + '].[' + @table + '] A
        CROSS APPLY (VALUES ' + @col + ') C(Col,Val)
WHERE
    A.ID = ''' + CAST(@ID AS VARCHAR(8)) + ''''

--Run Script
EXEC (@str)
Другие вопросы по тегам