【问题标题】:Extract SQL string from table to execute从表中提取 SQL 字符串以执行
【发布时间】:2019-04-15 13:33:45
【问题描述】:

我收到此错误:

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

得到最终结果?

【问题讨论】:

  • 您使用的是哪个 dbms? (该代码是特定于产品的。)

标签: sql-server tsql dynamic-sql


【解决方案1】:

我想你想要条件聚合:

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,但条件聚合救了我的命!
【解决方案2】:

我要接受(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

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

【讨论】:

    猜你喜欢
    • 2023-03-25
    • 2020-11-13
    • 2019-08-06
    • 1970-01-01
    • 1970-01-01
    • 2020-07-02
    • 1970-01-01
    • 1970-01-01
    • 2015-06-07
    相关资源
    最近更新 更多