我收到此错误:
第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
获得最终结果?
答案 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
?),以及为什么它不起作用。