Это зависит от того, для чего вы хотите эту переменную.
Я подозреваю, однако, что самым простым выходом было бы сохранить данные в сводной форме и оставить их до тех пор, пока они не будут возвращены клиентскому приложению. Затем сохраненный процесс может построить SQL, необходимый для отмены результата.
Сохраните и обработайте что-то вроде этого:
ID Col Value
-----------------------------------------------------
1 FName Dag
1 Email yeah.right@maybe.no
1 Col3 Value3
...
N FName Kristina
N Email my.first.love@sadness.info
N Col3 Value3
N Col4 Dag hasn't got this attribute
Когда приходит время вернуть данные клиентскому приложению, а не раньше, хранимый процесс может динамически генерировать SQL, чтобы разворачивать данные в следующее:
ID FName Email Col3 Col4
------------------------------------------------------------------------------------
1 Dag yeah.right@maybe.no Value3 (null)
....
N Kristina my.first.love@sadness.info Value3 Dag hasn't got this attribute.
Конечно, набор столбцов будет таким же большим, как набор различных значений Name в сводной таблице данных. Но это хорошо работает, если вы храните много видов объектов в одной таблице, но выбираете только наборы элементов с одинаковыми (или, по крайней мере, похожими) наборами атрибутов. Другое потенциально важное ограничение: ВСЕ будет просто текстом, так что подумайте о последствиях этого.
Однако я думал об использовании этой техники для создания DAL для целей быстрого прототипирования. Очевидно, что это очень дорого по времени и пространству по сравнению с нормализованными таблицами, но позволяет хранить, извлекать и обрабатывать меньшие объемы данных в общем виде.
Чтобы отменить поворот, сгенерируйте SQL с помощью шаблона, подобного следующему:
SELECT
ID,
MAX(CASE WHEN [Name] = 'FName' THEN [Value] END [FName]),
MAX(CASE WHEN [Name] = 'Email' THEN [Value] END [EMail]),
...
FROM
Stuff
GROUP BY
ID
Пока есть не более одной строки с Name = 'FName', это работает хорошо, так как мы группируем по ID. И генерировать SQL просто; форматирование требуется только для бита CASE:
DECLARE @case varchar(max)
SET @case = 'CASE WHEN [Name] = ''§name'' THEN [Value] END [§name])'
-- Get columns:
SELECT Column_Name INTO #cols FROM INFORMATION_SCHEMA.COLUMNS WHERE Table_Name = @tableName;
-- in loop (can't be bothered to include the code!)
SET @sql = @sql + REPLACE(@case, '§name', @colName)
...
EXEC(@sql)