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

use*_*640 2 sql t-sql 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
Run Code Online (Sandbox Code Playgroud)

然后我得到错误:

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'.
Run Code Online (Sandbox Code Playgroud)

谁能帮我?

谢谢!

gbn*_*gbn 5

在CREATE期间解析存储的proc时,该列不存在,因此您会收到错误.

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

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

但是,这是我真的不会做的事情:DDL和DML在同一位代码中