动态SQL临时表错误

时间:2015-02-11 16:18:40

标签: sql-server stored-procedures

我在MS SQL中发现了一个strage编译错误。

因此,假设我们有一个像这样的存储过程

CREATE PROCEDURE Test 
@FirstPart bit 
AS 


BEGIN
if @FirstPart = 1 begin
Declare @SQL varchar(max)
    set @SQL = 'ALTER TABLE #Test ADD Column2 varchar(100)'
    exec(@SQL)

    set @SQL = 'ALTER TABLE #Test ADD Column3 varchar(100)'
    exec(@SQL)
end else        
        SELECT Column1, Column2,Column3 FROM #Test
END

然后在另一个部分我们这样做

CREATE TABLE #Test (Column1 varchar(100))    
exec Test 1

通常这将执行2个alter table语句,没有问题,但此查询运行时出现错误

Msg 207, Level 16, State 1, Procedure Test, Line 15
Invalid column name 'Column2'.
Msg 207, Level 16, State 1, Procedure Test, Line 15
Invalid column name 'Column3'.

有什么想法吗?

编辑:

ALTER PROCEDURE Test 

AS 


BEGIN



--if @FirstPart = 1 begin
Declare @SQL varchar(max)
    set @SQL = 'ALTER TABLE #Test ADD Column2 varchar(100)'
    exec(@SQL)

    set @SQL = 'ALTER TABLE #Test ADD Column3 varchar(100)'
    exec(@SQL)
--end else      
        SELECT Column1, Column2,Column3 FROM #Test
END

2 个答案:

答案 0 :(得分:0)

就像您已经注意到的那样,查询计划是针对整个过程进行的。最有可能的原因是,尝试分析代码(在最坏的情况下甚至是数据)需要花费更多的时间来确定代码的哪些部分将实际执行,哪些代码不会执行。

如果你有这种功能,你可能应该将它们分成两个不同的程序。当使用在该部分的执行中实际使用的参数值制定计划时,这也有助于创建更好的计划 - 假设您的程序中实际上有更多功能。

答案 1 :(得分:0)

我找到的解决方法是select也应该出现在动态查询中。

create  PROCEDURE Test @FirstPart BIT
AS
  BEGIN
      DECLARE @SQL VARCHAR(max)

      SET @SQL = 'ALTER TABLE #Test ADD Column2 varchar(100)'

      EXEC(@SQL)

      SET @SQL = 'ALTER TABLE #Test ADD Column3 varchar(100)'

      EXEC(@SQL)

      EXEC('SELECT Column1,Column2,Column3 FROM  #Test') -- Dynamic query
  END

CREATE TABLE #Test
  (Column1 VARCHAR(100))

EXEC Test 1
相关问题