Извлечь строку SQL из таблицы для выполнения - PullRequest
1 голос
/ 15 апреля 2019

Я получаю эту ошибку:

Сообщение 120, Уровень 15, Состояние 1, Строка 12
Список выбора для оператора INSERT содержит меньше элементов, чем список вставки.Количество значений SELECT должно соответствовать количеству столбцов INSERT.

Как выбрать строку из таблицы и insert into @t1, чтобы получить конечный результат, например:

|    Date1    |   Date2     |    Date3     |     Date4   |    Date5      | 
+-------------+-------------+--------------+-------------+---------------+
|'Feb  5 2019'|'Feb  4 2019'|'Feb  1 2019 '|'Jan 30 2019'|'Jan 18 2019 ' | 

Iнеобходимо создать хранимую процедуру для создания динамического столбца.

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

Я хочу выбрать какой-то оператор изстрока и эти строки SQL, хранящиеся в таблице, подобной этой

Мой код показан:

declare @t1 table (id0 datetime,id1 datetime,id2 datetime,id3 datetime,id4 datetime)
INSERT INTO @t1 (id0,id1,id2,id3,id4)
select Dates = STUFF((    
         SELECT ',''' +TRSDate + ''''  FROM [StandaloneDWH].[zru].[r435_436tcr] where CLM_Id =90
            FOR XML PATH('')
         ), 1, 1, '')

После выполнения кода:

select Dates = STUFF((    
     SELECT ',''' +TRSDate + ''''  FROM [StandaloneDWH].[zru].[r435_436tcr] where CLM_Id =90
        FOR XML PATH('')
     ), 1, 1, '')

он показывает:

|                                 Dates                                  | 
|------------------------------------------------------------------------|
|'Feb  5 2019','Feb  4 2019','Feb  1 2019 ','Jan 30 2019','Jan 18 2019 ' | 

Как мне выполнить это и вставить в @ t1

select 
    'Feb  5 2019','Feb  4 2019','Feb  1 2019 ','Jan 30 2019','Jan 18 2019 '

, чтобы получить окончательный результат?

Ответы [ 2 ]

0 голосов
/ 15 апреля 2019

Я собираюсь принять (n информированное) предположение, что это SQL Server.Таким образом, вы можете использовать sp_executesql для запуска этого в качестве динамического SQL.Подсказка, это вам не поможет, потому что как только ваш запрос достигнет точки, где он выполняет динамический SQL, вы выйдете из сеанса, и переменная @ t1 TABLE будет потеряна.

DECLARE @sql NVARCHAR(4000);
SELECT @sql = 'DECLARE @t1 TABLE (id0 DATETIME, id1 DATETIME, id2 DATETIME, id3 DATETIME, id4 DATETIME);';
SELECT @sql += 'INSERT INTO @t1 (id0, id1, id2, id3, id4) SELECT ';
--SELECT @sql += STUFF((    
--         SELECT ',''' + TRSDate + '''' FROM [StandaloneDWH].[zru].[r435_436tcr] 
--       WHERE CLM_Id = 90
--            FOR XML PATH('')), 1, 1, '');
SELECT @sql += '''Feb  5 2019'',''Feb  4 2019'',''Feb  1 2019'',''Jan 30 2019'',''Jan 18 2019'';';
SELECT @sql += 'SELECT * FROM @t1;';
EXEC sp_executesql @sql;

Примечание. Я закомментировал ваш сценарий и жестко закодировал значения даты, чтобы показать, как это работает, но вам нужно будет раскомментировать свой раздел, а затем удалить строку под этим.

Результаты:

id0 id1 id2 id3 id4
2019-02-05 00:00:00.000 2019-02-04 00:00:00.000 2019-02-01 00:00:00.000 2019-01-30 00:00:00.000 2019-01-18 00:00:00.000

Ответ Гордона - это то, что вам действительно нужно, но я включил его, чтобы показать, как вы могли бы спасти свой существующий сценарий (вы, должно быть, потратили некоторое время на то, чтобы связываться с FOR XML PATH?), А также почему он не сработает.

0 голосов
/ 15 апреля 2019

Я думаю, вы хотите условное агрегирование:

insert into @t1 (id0, id1, id2, id3, id4)
    select max(case when seqnum = 1 then trsdate end),
           max(case when seqnum = 2 then trsdate end),
           max(case when seqnum = 3 then trsdate end),
           max(case when seqnum = 4 then trsdate end),
           max(case when seqnum = 5 then trsdate end)   
    from (select r.*,
                 row_number() over (order by trsdate) as seqnum
          from [StandaloneDWH].[zru].[r435_436tcr] r
          where CLM_Id = 90
         ) r;

Вы также можете использовать pivot для логики. Или генерируйте динамический SQL с вашим подходом.

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