SQL存储过程创建#Table从#Table错误中选择

时间:2016-05-25 13:55:38

标签: sql sql-server stored-procedures

我有一个我无法解决的简单问题。我有一个我创建的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检查的行吗?

2 个答案:

答案 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。因为我现在已经意识到这一点,我已经纠正了我的错误,并且它正在按照我的预期运作。现在我可以完成其余代码的问题。

感谢所有试图帮助解决此问题的人。已经过了漫长的一周!