2015-02-11 2 views
2

У меня есть таблица пар ключ-значение. Я создал скрипт с использованием динамического sql, который правильно поворачивает таблицу. Однако ключи имеют разные типы данных. Есть ли способ использовать клавиши во время или после поворота динамически? Я могу иметь типы данных в одной таблице пар ключ-значение для каждого ключа или в отдельной таблице, связанной с ключом.Могу ли я создать динамический сводный запрос из таблицы значений ключей с разными типами данных?

Динамический sql используется, потому что я не всегда знаю столбцы. Всегда будет тип данных.

Пример исходной таблицы:

sampleid  key value datatype 
------------------------------------ 
1001  Name Andrew varchar(50) 
1001  Date 20150129 datetime 
1002  Name Anna  varchar(50) 
1002  Date 20150129 datetime 

Окончательный результат будет это с именем NVARCHAR и дату как DateTime: Сценарий хранимая процедура, которая создает это в представление. Доступ осуществляется через внешние приложения, такие как SAS и Olive, которые выбирают тип данных из представления. Конечно, это не идеально, но это то, к чему мне поручено пытаться!

sampleid name  date 
----------------------------- 
1001  Andrew 20150129 
1002  Anna  20150129 
+0

'Anna' не даты и времени, так что вы не будете в состоянии преобразовать это. Что вы хотите для окончательного результата? Вы можете сделать это без преобразования данных, для чего вам нужно его преобразовать? – Taryn

+0

Спасибо, что поймали @bluefeet! Я исправил и добавил дополнительную информацию. –

+0

Если вам нужно создать это на лету - динамически, то вы не сможете сделать это в представлении. Динамический SQL можно запускать только в хранимой процедуре. – Taryn

ответ

3

Вы можете сделать это с использованием динамического SQL, вам просто нужно собрать два отдельных списка «новых столбцов» в виде строки. Один список будет включать имена столбцов, которые преобразуются в ваш тип данных, второй будет использоваться для функции PIVOT.

Код будет:

DECLARE 
    @cols AS NVARCHAR(MAX), 
    @colsConversion AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX) 

-- get the list of [key] items for the columns used in the PIVOT 
select @cols 
    = STUFF((SELECT ', ' + QUOTENAME([key]) 
      from yourtable 
      group by [key], datatype   
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

-- get the list of columns for the final select 
-- include a conversion of the columns into the correct datatype 
select @colsConversion 
    = STUFF((SELECT ', cast(' + QUOTENAME([key]) +' as '+ datatype+') as ' + QUOTENAME([key]) 
      from yourtable 
      group by [key], datatype   
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

-- the converted columns go in the final select list 
-- while the other @cols are used inside the PIVOT 
set @query = 'SELECT sampleid, ' + @colsConversion + ' 
      from 
      (
       select sampleid, [key], value 
       from yourtable 
      ) x 
      pivot 
      (
       max(value) 
       for [key] in (' + @cols + ') 
      ) p; ' 

exec sp_executesql @query; 

См SQL Fiddle with Demo

+0

Это здорово! Спасибо! –