Динамическая вставка большого количества результатов (более 1024) запроса в таблицу в SQL Server - PullRequest
1 голос
/ 27 февраля 2011

У меня есть хранимая процедура, которая выполняет динамический запрос, поэтому у меня есть строка с именем @template, которая в моем коде заменяется некоторыми инструкциями, поэтому после некоторой обработки у меня возникает очень большой запрос:

--Init the template and tell it to insert results to TEMPORAL table
SET @template = 'SELECT {LotsOfColumns},{EvenMoreColumns} INTO TEMPORAL FROM '+ @table_name;
--some handling substitute {LotsOfColumns} and {EvenMoreColumns} 
--...
--...
-- replace strings
SET   @template    = REPLACE(@template, '{LotsOfColumns}',   @templateLotsOfColumns);
SET   @template    = REPLACE(@template, '{EvenMoreColumns}', @templateEvenMoreColumns);

--very big query!!

EXEC (@template);

Поскольку таблица TEMPORAL является сгенерированной во время выполнения, я получаю сообщение об ошибке 1024 предельного столбца

Сообщение 4505, уровень 16, состояние 1, процедура процедуры, строка 3 превышает максимум 1024 столбцов.

  • Есть ли способ указать, что таблица содержит более 1024 столбцов?

Другой вариант, о котором я думал:

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

col1  col2  col3 ...  col1024   ... col3000
-------------------------------------------
14      34   45  ...      534   ...     657

but this??:

id   resultFromquery
--------------
1          1
2         34
3         45
...
1024     534
...
3000     657

Полагаю, это лучшее решение ... Но я не знаю, как изменить мой запрос:

SET @template = 'SELECT {LotsOfColumns},{EvenMoreColumns} INTO TEMPORAL FROM '+ @table_name;

--some handling sustitute {LotsOfColumns} and {EvenMoreColumns} 
EXEC @template;

для этого

Ответы [ 3 ]

2 голосов
/ 28 февраля 2011

Вы можете динамически построить синтаксис UNPIVOT следующим образом, чтобы получить желаемую структуру.

set @q='
SELECT CAST(SUBSTRING(col,2,10) AS INT) id, val resultFromquery
FROM '+ @table_name +'
UNPIVOT (val for col in ('+@templateLotsOfColumns+','+@templateEvenMoreColumns+')) unpvt'

exec(@q)
1 голос
/ 27 февраля 2011

Вы можете попробовать что-то вроде этого:

    create table #temp(id int, [value] int)
    truncate table #temp
    declare @sql nvarchar(max)
    set @sql=''
    declare @counter int
    set @counter = 1
    while(@counter<3001)
    begin
      set @sql = 'insert into #temp(id, [value])
      select @counter, col'+CAST(@counter, varchar(4)) +' from '+@table_name
      sp_executesql @sql
      set @sql=''
    end

Но я думаю, что ваш дизайн серьезно испорчен, если вам нужно делать подобные вещи.

0 голосов
/ 28 февраля 2011

Вы можете использовать UNPIVOT. Я только что проверил это на наборе результатов 1025 столбцов, и это работало хорошо!

WITH T(col1,col2,col3,col1024,col3000)
AS (
SELECT  14,34,45,534,657 
)
SELECT CAST(SUBSTRING(col,4,10) AS INT) id, val AS resultFromquery
FROM T
UNPIVOT (val for col in (col1,col2,col3,col1024,col3000)) unpvt

Возвращает

id          resultFromquery
----------- ---------------
1           14
2           34
3           45
1024        534
3000        657
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...