Имя столбца динамической сводки SQL Server (UNPIVOT) для значения строки - PullRequest
4 голосов
/ 19 января 2012

Я использую SQL Server.У меня есть запрос, который возвращает 1 строку данных.

SELECT *
FROM DBO.MY_TABLE
WHERE ID = 5

Это будет выглядеть примерно так:

ID    F_NAME    L_NAME    NUMBER
5     JOE       SCHMOE    1234567890

Мне нужен запрос / процедура, которая их выводит.Мне нужно, чтобы результат выглядел следующим образом:

ID        5
F_NAME    JOE
L_NAME    SCHMOE
NUMBER    1234567890

По сути, имя столбца становится значением в первом столбце, а значение строки становится значением второго столбца.

Хитрость в том, что я не всегда точно знаю, сколько будет столбцов, может быть 2 или 20 столбцов.Это может варьироваться.

Однако будет только ОДНА строка данных.

1 Ответ

1 голос
/ 19 января 2012

Итак, у вас есть пара проблем ... во-первых, это требует динамического sql, потому что таблица и столбцы не известны заранее, поэтому вы не можете просто использовать простой вывод.

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

Ваша вторая проблема в том, что все ваши типы данных неизвестны, поэтому вы должны привести все столбцы к чему-то, что может поддерживать все и любой длины ... varchar (max).

Итак, с учетом этих двух препятствий вот решение:

declare @yourTable varchar(50)
declare @yourKeyField varchar(50)
declare @yourKey varchar(50)

set @yourTable = 'MyTable' /** change to tablename or pass as parameter */
set @yourKeyField = 'ID'   /** change to fieldname or pass as parameter */
set @yourKey = '5'         /** change to key value or pass as parameter */

declare @query nvarchar(max)  

select @query = COALESCE(@query+' union all ','') + 'select ''' + c.name + ''' as
[Column], Cast([' + c.name + '] AS VarChar(MAX)) as [Value] from ' + @yourTable + ' 
where ' + @yourKeyField + ' = ''' + @yourKey + '''' from syscolumns c 
    inner join sysobjects o on c.id = o.id and o.xtype = 'u'
    where o.name = @yourTable order by c.colid

exec sp_executesql @query /** execute query */

Наконец, я не могу с чистой совестью рекомендовать решение, использующее динамический sql, без предупреждения об опасностях, связанных с этим (как с точки зрения производительности, так и с точки зрения возможности внедрения). Прочитайте эту превосходную статью, если вы хотите расширить свои знания по этому предмету.

http://www.sommarskog.se/dynamic_sql.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...