2013-03-22 64 views
0

我使用SQL Server 2005/2008 R2捕捉更新/插入計算列

我的SQL腳本是:

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

錯誤消息:

消息271,Level 16,State 1,Line 1
「MyColumn」列無法修改,因爲它既可以是計算列,也可以是UNION運算符的結果。

我知道MyColumn是從基地臺(比如當FullNameLastName + ', ' + 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'` 

此外,我無法從返回的腳本中找到與「計算列」或「聯合結果」操作有關的任何字段。

+0

http://www.sommarskog.se/error-handling-I.html – Hackerman 2013-03-22 20:38:37

+1

有'sys.computed_columns' **正好**告訴你哪些列被計算 - 只是做一個'SELECT Name FROM sys。 computed_columns'來獲得計算列的名稱 – 2013-03-22 23:06:13

回答

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 
+1

** OF COURSE有一個方法!! **有'sys.computed_columns' **完全**告訴你哪些列是計算出來的......還有一個' 「sys.columns」中的每個條目上都有「is_computed」標誌...... – 2013-03-22 23:05:49

+0

沒有marc,視圖字段不會顯示爲「is_computed = 1」。他們總是0.我在我的問題中提到過。 ljh,錯誤不被捕獲。這是我的全部問題。我在這個問題中提到過。 – yazanpro 2013-03-22 23:24:55

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表沒有按」不能完全保持最新狀態,並且不能完美地「讀取」查詢(並且會錯過諸如函數調用中的函數調用之類的事情)。但是對於標準的「視圖=來自表的列」對象,它可以正常工作。