我编写了一个脚本来在表中添加一列,并在成功执行时更新其值。我知道这只是一个简单的脚本,但是 'IF NOT EXISTS' 语句有什么问题,为什么 BEGIN 和 END 之间的脚本没有执行并返回错误。我验证没有数据库级别的 DDL 触发器来停止在数据库中添加列。
消息 207,级别 16,状态 1,第 24 行
无效的列名 ColumnName。
DECLARE @CloumnAdded bit
SET @CloumnAdded = 0
IF NOT EXISTS ( SELECT 1
FROM Sys.Columns
WHERE [Object_ID] = Object_ID('DBName.dbo.TableName')
AND Name = 'ColumnName' )
BEGIN
ALTER TABLE TableName ADD ColumnName varchar(120)
SET @CloumnAdded = 1
select @CloumnAdded, 'step 1 '
END
IF ( @CloumnAdded = 1 )
BEGIN
select @CloumnAdded,'step 2'
UPDATE TableName
SET ColumnName = '2669'
select @CloumnAdded,'step 3'
END
GO
您的问题是由于查询执行中涉及的不同步骤而发生的。首先是解析,然后是绑定,最后是执行。在解析提交的文本时,它被验证为有效的 SQL 并转换为内部表示。绑定将提交的 SQL 中的名称解析为 SQL Server 目录中的对象。不幸
TableName.ColumnName
的是,尝试绑定时不存在,因此该部分失败。您可以做两件事*。首先,将查询分成两批,一批用于创建列,一批用于更新列。如果第一个成功,只运行第二个。其次,放入
update
动态 SQL 并通过exec sp_executesql
. 这有效地在内部创建了第二批。*我现在能想到的。我敢肯定,更聪明的头脑可以建议其他人。