2013-08-29 6 views
0

Я пытаюсь создать хранимую процедуру, которая создаст временную таблицу A, столбцы которой будут зависеть от количества строк другой таблицы, B. Фон для этого заключается в том, что я разрешаю пользователям создавать свои собственные «группы», а информация о группах будет храниться в таблице B. Создание таблицы A будет смотреть на количество строк в таблице B и создавать столбец для каждой группы в таблице B (используя имя группы в таблице B в качестве имени столбца в таблице A). Я не могу инвертировать оси (axes?), Потому что строки будут представлять собой запись для каждого пользователя в моей системе, которая также будет переменной.Процедура создания таблицы с переменным числом столбцов

Итак, вкратце: Как создать процедуру для создания временной таблицы с переменным числом столбцов?

спасибо.

ответ

3
DECLARE @sSQL varchar(max), 
    @ColumnName CHAR(128) 

DECLARE TableCursor CURSOR FOR 
    SELECT ColumnName FROM GroupTable 

SET @sSQL = 'CREATE TABLE ##NewTempTable (' 

OPEN TableCursor 

FETCH NEXT FROM TableCursor INTO @ColumnName 

WHILE @@FETCH_STATUS = 0 
BEGIN 

SET @sSQL = @sSQL + RTRIM(@ColumnName) + ' CHAR(10) ,' 

FETCH NEXT FROM TableCursor INTO @ColumnName 

END 

CLOSE TableCursor 

DEALLOCATE TableCursor 

SET @sSQL = @sSQL + ')' 

EXEC (@sSQL) 

SELECT * FROM ##NewTempTable 

Надеюсь, это поможет. В DECLARE CURSOR вам нужно будет изменить «ColumnName» и «TableName» на фактический столбец/таблицу, которые вы запрашиваете.

+0

Пожалуйста, не добавляйте подписи к вашему ответу. – Sumurai8

+0

Ах блестящий. Это то, что я искал: возможность запуска произвольного кода в виде строки. Извините за задержку с ответом. Единственное, что я должен добавить, это пару утверждений/замещений для переменной @Column, чтобы гарантировать, что данные, которые я вытягиваю, подходят для имени столбца (например, заменяя пробелы символами подчеркивания) – user856358

0

Вы не должны делать этого - вместо этого сделайте название группы столбцом в таблице A.

+0

Чтобы быть ясным, ваше решение состояло бы в объединении всех имен групп в таблице B в один столбец таблицы A? В SQL вообще нет способа создать отдельный столбец для каждой группы в таблице B в таблице A? – user856358

+0

Да, это так. Я уверен, что есть способ сделать это, но это противоречит природе SQL, чтобы иметь такие определения таблиц переменных, потому что это затрудняет или не позволяет писать ваши запросы, не указывая динамические имена столбцов. Также представьте, как сложно было бы писать запросы, которые вычисляют метрики по различным категориям групп, или объединяют разные таблицы в имени группы. – jnylen

+1

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

Смежные вопросы