0

我正在使用 SQL Server 2005/2008 R2

我的 SQL 脚本是:

UPDATE MyView 
SET MyColumn = 'My new value' 
WHERE ID = 7

错误信息:

消息 271,级别 16,状态 1,行 1
无法修改列“MyColumn”,因为它是计算列或者是 UNION 运算符的结果。

我知道这MyColumn是来自基表的计算列(例如 when FullNameis computed from LastName + ', ' + FirstName

我的目标是捕获错误,以便脚本继续执行。

我尝试了以下脚本,但没有成功。未捕获错误:

BEGIN TRY
    UPDATE MyView 
    SET MyColumn = 'My new value' 
    WHERE ID = 7
END TRY 
BEGIN CATCH
    -- Error occurred while updating view. The script will keep running
END CATCH

我检查了以下脚本试图解决问题,但没有运气:

脚本 1

SELECT is_computed 
FROM sys.columns c, sys.views v
WHERE c.object_id = v.object_id
AND v.name = 'MyView'

前面的脚本为所有结果返回 0(这是不正确的,其中一列是计算列)

脚本 2:

SELECT * 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE table_name = 'MyView'`

此外,我在返回的脚本中找不到任何与“计算列”或“联合结果”操作有关的字段。

4

2 回答 2

1

首先,没有系统视图或表可以真正告诉您视图的哪一列是派生列或计算列。它几乎只能在运行时检测到,或者您可以使用 powershell 脚本或其他东西在 SQL 之外检测它。

如果您只想在异常发生后继续执行脚本,您可以使用 goto,但这不是一个好习惯。


begin try
   select 1/0
end try
begin catch
   Print 'error occurred'
   goto MarkPoint
end catch
select * from sys.columns
MarkPoint: 
  select top 1 * from sys.tables
于 2013-03-22T20:40:07.593 回答
0

并不是说它对您有帮助,但如果您正在运行 SQL Server 2012,您可以运行

sp_describe_first_result_set N'select * from View'

它将提供正确的信息(即 is_updateable 设置为 0,is_computed_column 设置为 1)。

这是一个不完全 100% 可靠的查询,它将返回视图中的所有列,这些列实际上是基表中的计算列:

    SELECT c.name FROM sys.objects AS O
   INNER JOIN sys.sql_expression_dependencies SED ON SED.referenced_id=O.object_id
    INNER JOIN sys.objects O2 ON O2.object_id=SED.referencing_id
    INNER JOIN sys.columns c on c.object_id = o.object_id
    where
     QUOTENAME(O2.name) = 'MyView'
     and c.is_computed = 1

它不是 100% 可靠的,因为 sql_expression_dependencies 表不能完全保持最新状态,并且不能完美地“读取”查询(并且它错过了函数调用中的函数调用等内容)但是对于标准的“view =表中的列”对象,它将正常工作。

于 2013-03-22T20:44:56.753 回答