【发布时间】:2021-08-22 22:37:27
【问题描述】:
我有以下 T-SQL 脚本,它将旧列的值复制到新列中,然后删除旧列。见这里:
--step 1: create new column
IF NOT EXISTS(SELECT 1 from sys.columns
WHERE Name = N'UserColumn2'
AND Object_ID = Object_ID(N'Account'))
BEGIN
ALTER TABLE Account
ADD UserColumn2 int null
;
END
GO
;
--step 2: copy and drop
IF NOT EXISTS(SELECT 1 from sys.columns
WHERE Name = N'UserColumn1'
AND Object_ID = Object_ID(N'Account'))
BEGIN
PRINT 'Column ''UserColumn1'' does not exist.';
END
ELSE
BEGIN
UPDATE Account
SET UserColumn2 = UserColumn1
WHERE UserColumn1 is not null
;
BEGIN TRY
Declare @count int;
SELECT @count = Count(AccountID)
FROM Account
WHERE UserColumn2 <> UserColumn1
;
IF @count > 0
BEGIN
--PRINT 'Not all records were properly updated. UserColumn1 has not been dropped.';
THROW 50000,'Not all records were properly updated. UserColumn1 has not been dropped.',1
;
END
ELSE
BEGIN
ALTER TABLE Account
DROP Column UserColumn1
;
END
END TRY
BEGIN CATCH THROW; END CATCH
END
GO
;
第一步运行正确,但即使UserColumn1 列不存在,第二步仍会在ELSE 块中引发错误:
(注意:这里的代码实际上在第 24 行抛出。我的 SSMS 中的代码没有“步骤 1”等的 cmets)
为什么会发生这种情况,我该如何预防?
我尝试删除 NOT 并将指令移出 ELSE 块,但行为没有改变。我也试过这样写第二步的开头:
IF (SELECT 1 from sys.columns
WHERE Name = N'UserColumn1'
AND Object_ID = Object_ID(N'Account')) <> null
我得到了同样的结果。
【问题讨论】:
标签: sql-server tsql if-statement exists