如何更新表并忽略计算列(如果已计算),但如何更新表(未计算)

时间:2019-06-10 12:04:47

标签: sql-server calculated-columns

我有不同版本的SQL Server数据库:

  • DB 1中,“ IsReadOnly”列是一个计算列
  • DB 2中,“ IsReadOnly”列是一个非计算列

我需要创建一个在两个版本上都可以使用的标准脚本:

IF EXISTS (SELECT 1 FROM sys.columns 
           WHERE Name = N'IsReadOnly'
             AND Object_ID = OBJECT_ID(N'dbo.TableA')
             AND is_computed = 0) 
BEGIN
    UPDATE TableA   
    SET IsReadOnly = @IsReadOnly    
    WHERE Id = @ID 
END

运行上述命令时,它可以在is_computed = 0的版本上运行。但是当运行is_computed = 1的版本时,我可以得到:

  

Msg 271,第16级,状态1,第322行
  无法修改“ IsReadOnly”列,因为它要么是计算列,要么是UNION运算符的结果

非常感谢任何帮助。谢谢

1 个答案:

答案 0 :(得分:3)

这是编译时与执行时的问题。错误发生在无法更新值的数据库上。

您可以使用动态SQL解决它:

IF EXISTS( SELECT 1 FROM sys.columns 
           WHERE Name = N'IsReadOnly'
           AND Object_ID = Object_ID(N'dbo.TableA')
           AND is_computed = 0          
          ) 
BEGIN
    EXEC sp_execute_sql N'
Update TableA    
   Set IsReadOnly = @IsReadOnly     
   Where Id = @ID',
                       N'@IsReadOnly int, @ID int',  -- guessing at the types
                       @IsReadOnly=@IsReadOnly, @ID=@ID;
END

不过,一个更简单的方法可能是TRY / CATCH块:

BEGIN TRY
    Update TableA    
       Set IsReadOnly = @IsReadOnly     
       Where Id = @ID ;
END TRY
BEGIN CATCH
    -- Check for the particular error and do something when that occurs
END CATCH;