Как преобразовать строку в столбец в SQL Server? - PullRequest
0 голосов
/ 28 февраля 2019

Как преобразовать строку в столбец в SQL Server.

У меня есть одна таблица, есть 3 столбца, которые я хочу преобразовать в однорядный Пример кода, как показано ниже

CREATE TABLE #TABLE (
    ID INT PRIMARY KEY ,
    NAME VARCHAR(10),
    ADDRESS VARCHAR(10)
);

INSERT INTO  #TABLE VALUES ('ABC','INDIA')
    SELECT *
    FROM #TABLE

ID | NAME |ADDRESS
1  | ABC  | INDIA

Я хочу какэто

ID     |1
NAME   |ABC
ADDRESS|INDIA

Я пытаюсь добиться успеха, используя CTE & Pivot Hard luck

1 Ответ

0 голосов
/ 28 февраля 2019

Настройка таблицы макет с вашими значениями

DECLARE @tbl TABLE (
    ID INT IDENTITY PRIMARY KEY ,
    [NAME] VARCHAR(10),
    [ADDRESS] VARCHAR(10)
);

INSERT INTO  @tbl VALUES ('ABC','INDIA')
                        ,('one','more')

- Этот подход использует CROSS APPLY с VALUES() для создания производного набора результатов
- Вам нужнозаранее знать имена столбцов, и вы должны привести их к общему типу

SELECT A.*
FROM @tbl t
CROSS APPLY (VALUES('ID',CAST(t.ID AS NVARCHAR(100)))
                  ,('NAME',CAST(t.[NAME] AS NVARCHAR(100)))
                  ,('ADDRESS',CAST(t.[ADDRESS] AS NVARCHAR(100)))) A(ColumnName,ColumnValue)

- этот подход полностью универсален и работает с любым набором и типом

SELECT AllCols.value('local-name(.)','nvarchar(max)') AS ColumnName
      ,AllCols.value('text()[1]','nvarchar(max)') AS ColumnValue
FROM
(
    SELECT * FROM @tbl FOR XML PATH('row'),TYPE
) A(AsXml)
CROSS APPLY A.AsXml.nodes('/row/*') B(AllCols)

Идеяпозади это читать select как XML и использовать общие возможности XQuery:

<row>
  <ID>1</ID>
  <NAME>ABC</NAME>
  <ADDRESS>INDIA</ADDRESS>
</row>
<row>
  <ID>2</ID>
  <NAME>one</NAME>
  <ADDRESS>more</ADDRESS>
</row>
...