SQL 2012 - 使用 If then else 更新/插入带有变量列的记录



我已经在这个问题上敲了一会儿了,我觉得我非常接近,但是当我试图让事情顺利进行时,我遇到了一个问题。

因此,出于我的目的,我有大量的数据库可以运行此脚本。取决于数据库的版本(我们有多个客户,并非所有客户都拥有所有新表/列的最新和最佳版本)。

我目前有 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。

最新更新