2012-01-18 4 views
4

Я использую SQL Server. У меня есть запрос, который возвращает 1 строку данных.Имя столбца Dynamic SQL Server Pivot (UNPIVOT) для значения строки

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 столбцов. Он может меняться.

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

+0

я отредактирован заголовок вопроса, потому поворачивая колонку в ряд является «UNPIVOT» не является стержнем (поворот строки в колонке) – RThomas

ответ

1

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

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

Ваша вторая проблема заключается в том, что все ваши типы данных неизвестны, поэтому вам нужно отбросить все столбцы на то, что может поддерживать все и любую длину ... 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