我编写了一个存储过程如下:
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'.
谁能帮帮我?
谢谢!
答案 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