Как динамически генерировать определения столбцов таблицы в функции SQL Server 2008 - PullRequest
0 голосов
/ 14 мая 2009

В SQL Server 2008 у меня есть ситуация, когда мне нужно вернуть динамически сгенерированную таблицу, а столбцы также сгенерированы динамически.

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

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

В настоящее время это реализовано в C #, но я ожидаю, что это должно быть выполнимо в хранимой процедуре или функции, но я не уверен, как сделать несколько запросов для создания этого запроса, чтобы затем вернуть таблицу.

Спасибо.

SELECT ResultID, ResultName, ResultDescription, 
CAST([233] AS Real) as [ResultColA], 
CAST([234] AS Int) as [ResultColB], 
CAST([236] AS NVarChar) as [ResultColC], 
CAST([237] AS Int) as [ResultColD]
FROM (
    SELECT st.*, avt.ResultID as avtID, avt.SomeAttrID, avt.Value 
    FROM Result_AV avt 
    JOIN Result st ON avt.ResultID = st.ResultID) as p 
    PIVOT ( 
        MAX(Value) FOR AttributeID IN ([233], [234], [236], [237])) as pvt

Обновление: если у меня есть таблица, в которой есть производитель автомобилей, и мне нужны все атрибуты автомобилей производства GM. Я бы посмотрел информацию об автомобилях, использовал ее, чтобы получить информацию обо всех производителях автомобилей, которые были бы GM, затем я хотел бы получить информацию обо всех автомобилях, произведенных GM, но, поскольку информация была сгенерирована динамически, столбцы разные. Это то место, где я нахожусь, и мне нужно динамически генерировать эту таблицу. Мне любопытно, могу ли я просто вызвать веб-сервис, получить динамически сгенерированный запрос и затем выполнить хранимую процедуру или функцию для выполнения этого запроса.

Обновление 2: следующий шаг после того, как я получу эту таблицу, это то, что мне нужно будет сложить все параметры автомобиля (в данном случае), чтобы определить фактическую цену автомобиля. Вот почему он должен быть в табличном формате. На данный момент я смотрю на автомобили, сделанные GM, но я мог бы сделать еще один запрос на лодки, сделанные SeaRay, и запрос должен работать так же, даже если столбцы таблицы на лодках отличаются от машин были.

1 Ответ

0 голосов
/ 15 мая 2009

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

DECLARE @template AS varchar(MAX)

SET @template = '
SELECT ResultID, ResultName, ResultDescription
{@SELECT_COLUMN_LIST}
FROM (
    SELECT st.*, avt.ResultID as avtID, avt.SomeAttrID, avt.Value 
    FROM Result_AV avt 
    JOIN Result st ON avt.ResultID = st.ResultID) as p 
    PIVOT ( 
        MAX(Value) FOR AttributeID IN ({@PIVOT_COLUMN_LIST})) as pvt'

DECLARE @sql AS varchar(MAX)

SET @sql = REPLACE(REPLACE(@template, '{@SELECT_COLUMN_LIST}', @SELECT_COLUMN_LIST), '{@PIVOT_COLUMN_LIST}', @PIVOT_COLUMN_LIST)

EXEC (@sql)

Чтобы заполнить @SELECT_COLUMN_LIST и @PIVOT_COLUMN_LIST, у вас есть несколько опций, но что-то вроде этого избавляет от необходимости использовать курсор или неловкие строковые операции:

SELECT @PIVOT_COLUMN_LIST = COALESCE(@PIVOT_COLUMN_LIST, '') + ',' + QUOTENAME(value)
FROM (SELECT DISTINCT value FROM table)

Очевидно, что для @SELECT_COLUMN_LIST вам необходимо объединить эту информацию с некоторыми метаданными.

Я сделал такие вещи для простоты обслуживания, потому что PIVOT и UNPIVOT не позволяют спискам быть динамическим SQL (потому что они приводят к изменению схемы в выходной таблице). Для клиентского стиля отчета или использования списка, где столбцы не интерпретируются, это не имеет значения.

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