从表中提取SQL字符串以执行

时间:2019-04-15 13:33:45

标签: sql-server tsql dynamic-sql

我收到此错误:

  

第15级,州1,第12行的消息120
  INSERT语句的选择列表包含的项目少于插入列表。 SELECT值的数量必须与INSERT列的数量匹配。

如何从表和| Date1 | Date2 | Date3 | Date4 | Date5 | +-------------+-------------+--------------+-------------+---------------+ |'Feb 5 2019'|'Feb 4 2019'|'Feb 1 2019 '|'Jan 30 2019'|'Jan 18 2019 ' | 中选择一个字符串,以获得最终结果,如:

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, '')

我必须运行存储过程才能创建动态列。

找到最大列数后,我创建表并尝试插入表中。

我想从字符串中选择一些语句,并将这些SQL字符串存储在这样的表中

显示我的代码:

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 ' | 

它显示:

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

我该如何执行并插入@ t1

programming language

获得最终结果?

2 个答案:

答案 0 :(得分:0)

我认为您需要条件聚合:

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。

答案 1 :(得分:0)

我很想知道这是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?),以及为什么它不起作用。