Получить имена столбцов SQL Server со значениями

Я пытаюсь создать запрос, который позволяет мне иметь имя столбца рядом со значениями столбца, которые он находит.

В качестве примера:

SELECT 
    * 
FROM 
    INFORMATION_SCHEMA.COLUMNS 
WHERE 
    TABLE_NAME = 'saverTbl'

Приведенное выше возвращает все имена столбцов в этой таблице следующим образом:

id, Link_userTblID, type, environment, vendor, theGUID, theGUID, etc etc...

Теперь мне нужно получить вывод из имени таблицы рядом со значением. Это мой запрос, чтобы просто получить мои значения из таблицы:

SELECT 
    * 
FROM 
    saverTbl 
WHERE 
    LINK_userTblID = @val1

Приведенное выше возвращает строку, соответствующую LINK_userTblID, например:

32, 1, 'Blah', 'something', 'Adobe', 546656156-45332-54616516-4515, etc etc..

Теперь собираем все это вместе (вот о чем этот вопрос):

id: 32,
LINK_userTblID: 1,
type: Blah,
environment: something,
vendor: Adobe,
theGUID: 546656156-45332-54616516-4515,
etc etc.....

В значительной степени требуется вывод в формате json, но имя столбца совпадает с значением столбца.


person StealthRT    schedule 05.03.2018    source источник
comment
Почти уверен, что то, что вы называете именами таблиц, на самом деле является именами столбцов. В последнем предложении вы правильно поняли; не уверен, что вы думаете в начале поста.   -  person Tab Alleman    schedule 05.03.2018
comment
Вы понимаете, что сейчас в SQL Server много поддержки JSON? Вы не хотите и не должны делать это так, как пытаетесь. docs.microsoft.com/en-us/sql/relational-databases/json/   -  person Sean Lange    schedule 05.03.2018


Ответы (2)


Попробуй это:

SELECT * FROM saverTbl 
WHERE LINK_userTblID = @val1
FOR JSON PATH
person Michał Turczyn    schedule 06.03.2018

Предполагая, что это предназначено для одной строки, вы можете попробовать это:

WITH cte AS
(
    SELECT
    (SELECT TOP 1 * FROM sys.objects FOR XML PATH('row'),TYPE) AS TheXml
)
SELECT TheElement.value('local-name(.)','nvarchar(max)')
       + ': '
       + TheElement.value('text()[1]','nvarchar(max)') AS YourOutput
FROM cte
CROSS APPLY TheXml.nodes('/row/*') AS A(TheElement);

Результат:

YourOutput
---------------
name: sysrscols
object_id: 3
schema_id: 4
parent_object_id: 0
type: S 
type_desc: SYSTEM_TABLE
create_date: 2012-02-10T20:15:58.693
modify_date: 2012-02-10T20:15:58.700
is_ms_shipped: 1
is_published: 0
is_schema_published: 0

XML в сочетании с XQuery и XPath представляет собой очень мощный набор инструментов для решения довольно общих проблем. CTE создает XML, который выглядит следующим образом:

<row>
  <name>sysrscols</name>
  <object_id>3</object_id>
  <schema_id>4</schema_id>
  <parent_object_id>0</parent_object_id>
  <type>S </type>
  <type_desc>SYSTEM_TABLE</type_desc>
  <create_date>2012-02-10T20:15:58.693</create_date>
  <modify_date>2012-02-10T20:15:58.700</modify_date>
  <is_ms_shipped>1</is_ms_shipped>
  <is_published>0</is_published>
  <is_schema_published>0</is_schema_published>
</row>

Вызов /row/* извлекает все узлы ниже <row> в качестве производной таблицы. Остальное довольно просто XQuery.

person Shnugo    schedule 05.03.2018