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

Extract SQL string from table to execute

我收到这个错误:

Msg 120, Level 15, State 1, Line 12
The select list for the INSERT statement contains fewer items than the insert list. The number of SELECT values must match the number of INSERT columns.

我如何 select 来自 table 和 insert into @t1 的字符串以获得最终结果,例如:

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

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

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

我想 select 来自字符串的一些语句,而那些 SQL 字符串存储在 table 这样的

显示我的代码:

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 '

得到最终结果?

我想你想要条件聚合:

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。

我会(根据知情)猜测这是 SQL 服务器。所以你可以使用 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

Gordon 的答案是您真正需要的,但我将其包括在内是为了展示您如何挽救现有脚本(您一定花了一些时间来弄乱 FOR XML PATH?),以及为什么它不会工作。