我已经在这个问题上敲了一会儿了,我觉得我非常接近,但是当我试图让事情顺利进行时,我遇到了一个问题。
因此,出于我的目的,我有大量的数据库可以运行此脚本。取决于数据库的版本(我们有多个客户,并非所有客户都拥有所有新表/列的最新和最佳版本)。
我目前有 2 个脚本被我的 CSR 用来更新表,但我正在尝试删除用于确定需要运行哪个脚本的人为元素(正如您可以猜到的,这个项目是有人在新数据库上运行旧脚本的结果,这在我们的软件中留下了各种有趣的意外后果)。
话虽如此,我需要我的脚本来更新我的"USERS"表,但是需要进入该表的值需要考虑我正在运行的版本。
因此,举个我正在做的事情的例子,假设我有 2 个版本,1 和 2。在版本 1 中,我有以下列:
- 用户标识
- 密码
- 用户Nbr
- 用户LName
- 用户FName
在版本 2 中,我添加了一列:用户类型 ID
考虑到这一点,我可以得到一个简单的 If then else 脚本来打印我的版本号,如下所示:
IF ((select VersionName from versions where VersionID = (select max(versionID) from versions)) = '2')
PRINT 'VERSION 2'
ELSE PRINT 'VERSION 1'
这没有问题。
当我尝试使用相同的逻辑更新我的用户记录时,我收到一个错误:
似乎它在尝试应用逻辑之前尝试列名"用户类型 ID"无效。
阅读完整的脚本(而在我的理想世界中,它会在尝试验证脚本是否可以运行之前遵守逻辑)。我尝试将要应用于版本 2 变体的语句封装在括号中,但这给出了以下错误:
")"附近的语法不正确。
我用于版本 1 的示例脚本:
DECLARE @Count int
SELECT @Count = UserNbr FROM Users WHERE UserID = 'TEST'
IF ISNULL(@Count, 0) = 0
BEGIN
--TEST TestUser
INSERT Users (userID, Password, UserLName, UserFName)
VALUES (
'TEST', 'Password', 'User', 'Test')
END
ELSE
BEGIN
UPDATE Users SET Password = 'Password', WHERE UserID = 'TEST'
END
我用于版本 2 的示例脚本:
DECLARE @Count int
SELECT @Count = UserNbr FROM Users WHERE UserID = 'TEST'
IF ISNULL(@Count, 0) = 0
BEGIN
--TEST TestUser
INSERT Users (userID, Password, UserLName, UserFName, UserTypeID)
VALUES (
'TEST', 'Password', 'User', 'Test', 1)
END
ELSE
BEGIN
UPDATE Users SET Password = 'Password', WHERE UserID = 'TEST'
END
这是我提出的错误
:DECLARE @Count int
SELECT @Count = UserNbr FROM Users WHERE UserID = 'TEST'
IF ((select VersionName from versions where VersionID = (select max(versionID) from versions)) = '2')
IF ISNULL(@Count, 0) = 0
BEGIN
--TEST TestUser
INSERT Users (userID, Password, UserLName, UserFName)
VALUES (
'TEST', 'Password', 'User', 'Test')
END
ELSE
BEGIN
UPDATE Users SET Password = 'Password', WHERE UserID = 'TEST'
END
ELSE
IF ISNULL(@Count, 0) = 0
BEGIN
--TEST TestUser
INSERT Users (userID, Password, UserLName, UserFName, UserTypeID)
VALUES (
'TEST', 'Password', 'User', 'Test', 1)
END
ELSE
BEGIN
UPDATE Users SET Password = 'Password', WHERE UserID = 'TEST'
END
显然,我提供了一个精简版本的东西,但逻辑和语法与我在环境中使用的相同。我做错了什么?
SQL Server将在执行之前分析查询。正如您注意到的那样,在 Ver 1 环境中使用相同的脚本会在用户类型 ID 上出现错误。
一种方法是将 INSERT 语句编码为动态 sql。这样,引擎将无法解析动态查询,也不会抛弃 erorr。