首页 > 解决方案 > 从表中提取 SQL 字符串以执行

问题描述

我收到此错误:

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

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

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

我想从一个字符串中选择一些语句,并将这些 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 '

得到最终结果?

标签: sql-servertsqldynamic-sql

解决方案


我认为你想要条件聚合:

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。


推荐阅读