我有不同版本的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运算符的结果
非常感谢任何帮助。谢谢
答案 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;