是否可以测试列的存在,然后根据该列是否存在来选择操作



我正在尝试创建一个在某种程度上通用的查询,以便针对同一DB的不同版本运行。在旧版本中,我要处理的特定表中不存在某些列。这个想法是由一个不知道自己有什么版本的人来运行。因此,我试图让查询检查某个列是否存在(如果该列不存在,其他有问题的列也不存在(,然后根据存在和不存在的列运行同一脚本的两个变体中的一个。

掩盖一些专有信息,这就是问题所在:

IF COL_LENGTH('dbo.users', '<column A>') IS NOT NULL -- Check for existence of <column A> column
-- Some earlier versions do not have this column
UPDATE Users
SET Password = 'XXXX', <column A> = 0, <column B> = NULL
WHERE Login = 'User' -- Reset password for later versions
ELSE
UPDATE Users
SET Password = 'XXXX'
WHERE Login = 'User' -- Reset password for earlier versions
PRINT 'The Password for Login "User" has been reset to XXXX.'
END

我发现的问题是,由于旧版本的数据库中不存在列A,整个脚本(在这个区域上方还有更多内容(都出错了,什么也没做。如果该列不存在,它似乎不会忽略显示的第一个更新语句。

在较新版本的DB上测试是完全成功的,尽管该版本有A列。

对此有任何想法,我们将不胜感激。非常感谢。

问题是脚本需要编译。并且您在编译中缺少列。我可以建议:

IF EXISTS (SELECT 1
FROM INFORMATION_SCHEMA.COLUMNS c
WHERE TABLE_SCHEMA = 'dbo' AND
TABLE_NAME = 'users' AND
COLUMN_NAME = '<column A>'
) -- Check for existence of <column A> column
BEGIN
-- Some earlier versions do not have this column
EXEC('
UPDATE Users
SET Password = ''XXXX'', <column A> = 0, <column B> = NULL
WHERE Login = ''User''
'); -- Reset password for later versions
END;
ELSE
BEGIN
UPDATE Users
SET Password = 'XXXX'
WHERE Login = 'User' -- Reset password for earlier versions
PRINT 'The Password for Login "User" has been reset to XXXX.'
END;

两个版本都有Password,所以ELSE应该编译得很好。

最新更新