存储过程包括添加列,更新该列的数据以及从该表中选择所有数据

时间:2009-12-09 02:24:52

标签: sql tsql sql-server-2000

我编写了一个存储过程如下:

  CREATE PROC spSoNguoiThan 
   @SNT int
    AS 
       begin 
    IF not exists (select column_name from  INFORMATION_SCHEMA.columns where
                    table_name = 'NhanVien' and   column_name = 'SoNguoiThan')  

            ALTER TABLE NhanVien ADD   SoNguoiThan int
    else 
           begin
        UPDATE  NhanVien
                SET  NhanVien.SoNguoiThan = (SELECT  Count(MaNguoiThan)FROM NguoiThan
                                             WHERE MaNV=NhanVien.MaNV 
                                             GROUP BY  NhanVien.MaNV)   
           end   

    SELECT *
        FROM NhanVien 
    WHERE    SoNguoiThan>@SNT
 end 
GO

然后我收到错误:

Server: Msg 207, Level 16, State 1, Procedure spSoNguoiThan, Line 12
Invalid column name 'SoNguoiThan'.
Server: Msg 207, Level 16, State 1, Procedure spSoNguoiThan, Line 15
Invalid column name 'SoNguoiThan'.

谁能帮帮我?

谢谢!

2 个答案:

答案 0 :(得分:5)

在CREATE期间解析存储过程时,该列不存在,因此您会收到错误。

逐行运行内部代码是有效的,因为它们是分开的。第二批(UPDATE)运行,因为该列存在。

解决这个问题的唯一方法是使用动态SQL进行更新并选择,以便在EXECUTE时间之前解析它(不像现在那样创建时间)。

然而,这是我真的不会做的事情:DDL和DML在相同的代码中

答案 1 :(得分:0)

我遇到了同样的问题,发现除了使用动态sql之外,我可以通过交叉连接到只有一行的临时表来解决它。这导致脚本编译器在编译时不尝试解析重命名的列。下面是我在不使用动态SQL

的情况下解决问题的示例
select '1' as SomeText into #dummytable

update q set q.ValueTXT = convert(varchar(255), q.ValueTXTTMP) from [dbo].[SomeImportantTable] q cross join #dummytable p