我有一个我无法解决的简单问题。我有一个我创建的SP,并且很难获得我想要的结果。在SP中我创建了2 #TempTables
,我也尝试select * from #TempTable
。我从故障排除目的添加了Select
,而不是最终代码的一部分。当我添加Select
时,我收到此错误:
消息213,级别16,状态7,过程spRowsConcat,第24行 列名或提供的值数与表定义不匹配。
整个代码目前看起来像这样:
ALTER PROCEDURE [dbo].[spRowsConcat]
-- Add the parameters for the stored procedure here
@AddSQL1 varchar(1000) = null,
@AddSQL2 varchar(1000) = null
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for procedure here
declare @WorkOrder varchar(50),@Number int,@Number2 int
declare @SQL1 varchar(1000),@SQL2 varchar(1000)
print 'Declare variables'
create table #TempTable(ID varchar(255), Data varchar(max), Number int identity(1,1))
print 'Create #TempTable'
select * from #TempTable
create table #TempTable2(ID varchar(255), Data varchar(max), Number int identity(1,1))
print 'Create #TempTable2'
select * from #TempTable2
set @SQL1 = 'insert into #TempTable2(ID,Data)'
print 'Set SQL1'
set @SQL2 = 'insert into #TempTable(ID)'
print 'Set SQL2'
set @SQL1 = @SQL1 + ' ' + @AddSQL1
set @SQL2 = @SQL2 + ' ' + @AddSQL2
print 'Re-Set SQL1/2'
print @SQL1
print @SQL2
exec (@SQL1)
exec (@SQL2)
delete from #TempTable
from #TempTable where ID is null and Data is null
delete from #TempTable2
from #TempTable2 where ID is null and Data is null
set @Number = (select top 1 Number from #TempTable order by Number)
set @Number2 = (select top 1 Number from #TempTable2 order by Number)
print 'After Setting the Numbers'
select * from #TempTable
select * from #TempTable2
print 'After selecting the tables'
while (select count(1) from #temptable where Data is null) > 0
begin
set @WorkOrder = (select ID from #TempTable where Number = @Number)
print ('#TempTable WorkOrder: ' + @WorkOrder + ' ,@Number: ' + cast(@number as varchar(10)) + ' ,@Number2: ' + cast(@Number2 as varchar(20)))
while (select ID from #TempTable where Number = @Number) = (select ID from #TempTable2 where Number = @Number2)
begin
Print ('Number: ' + cast(@Number as varchar(20)))
Print ('Number2: ' + cast(@Number2 as varchar(20)))
update #TempTable
set Data = isnull(t.Data,'') + '; ' + tt.Data
from #TempTable t
join #TempTable2 tt on t.ID = tt.ID and t.Number = @Number
and tt.Number >= @Number2
print ('Update Complete for @Number2: ' + cast(@Number2 as varchar(20)) + ' @Number: ' + cast(@Number as varchar(20)))
set @Number2 = @Number2 + 1
end
update #TempTable
set Data = ''
where Data is null and Number = @Number
set @Number = @Number + 1
end
update #TempTable
set Data = STUFF(Data,1,1,' ')
select ID,Data from #TempTable
END
我不明白为什么我会收到此错误。这是一个简单的select
,当我在创建它之后第一次选择它时,#TempTable
中甚至没有任何内容,但这就是它出错的地方。如果我删除了Select
,那么它会在Select
的下一个#TempTables
出现错误。我需要这些工作,所以我可以看到还有什么不在我的代码中工作。我添加了一堆Print
语句,这样我就可以看到错误时代码的位置。
修改
我在这里有一个if
来检查表#TempTable3
是否已经存在并删除它(如果有),然后重新创建它:
create table #TempTable3(ID varchar(255), Data varchar(max), Number int identity(1,1))
insert into #TempTable3(ID,Data)
exec spRowsConcat @AddSQL1='select distinct CAST(wm.WorkOrder as varchar(50)), convert(nvarchar(50), mr.ActualDate,101)
from working.MaterialReceipt mr
left join working.PurchaseOrderLine_NonFiltered wmpol on wmpol.Id = mr.PurchaseOrderLine and mr.ActualDate is not null
left join working.WorkMaterial_nonFiltered wm on wm.cd_PurchaseOrderLine = wmpol.Id
left join working.WorkOrderT wo on wo.WOId = wm.WorkOrder
Order by cast(wm.WorkOrder as varchar(50))'
,@AddSQL2='select distinct CAST(wm.WorkOrder as varchar(50))
from working.MaterialReceipt mr
left join working.PurchaseOrderLine_NonFiltered wmpol on wmpol.Id = mr.PurchaseOrderLine and mr.ActualDate is not null
left join working.WorkMaterial_nonFiltered wm on wm.cd_PurchaseOrderLine = wmpol.Id
left join working.WorkOrderT wo on wo.WOId = wm.WorkOrder
Order by cast(wm.WorkOrder as varchar(50))'
select * from #TempTable3
当我只运行exec
时它工作正常,但是当我运行整个事情时它失败了。出于某种原因,如果表存在,我无法添加IF
检查的行吗?
答案 0 :(得分:1)
问题在于select语句中的列数作为参数给出。如果你插入子句是这样的:
insert into #TempTable2(ID,Data)
然后你的select语句只能包含完全相同数量(和类型)的列。
您可以通过select into
代替create table
+ insert into
完成此操作:
select xxx, yyy ... into #tempTable2
修改:
现在,当问题被编辑时,问题很明显:
insert into #TempTable3(ID,Data) exec spRowsConcat ...
然后在程序中:
select * from #TempTable
此表已创建3列:
create table #TempTable(ID varchar(255), Data varchar(max), Number int ...
答案 1 :(得分:0)
我认为答案是我是个白痴。我才意识到为什么我会收到这个错误。我被@JamesZ搞砸了。在我最后创建的SP中,我从一个临时表中选择了2列,这些列被插入到我在调用SP时创建的#TempTable3
中。当我添加额外的select
语句时,我没有意识到,但这意味着这些选择也将被插入#TempTable3
。因为我现在已经意识到这一点,我已经纠正了我的错误,并且它正在按照我的预期运作。现在我可以完成其余代码的问题。
感谢所有试图帮助解决此问题的人。已经过了漫长的一周!