2013-12-12 22 views
1

下面顯示的代碼,除其他事項外,用於在數據庫中的所有觸發器的源代碼sys.syscomments.name長度> 4000

SELECT so.name AS trigger_name, 
    s.name AS table_schema, 
    t.name AS table_name, 
    LEN (sc.[text]) as len, 
    sc.[text] AS trigger_content 
FROM [GDI-193-DEV].dbo.sysobjects so 
    INNER JOIN [GDI-193-DEV].sys.tables t ON so.parent_obj = t.object_id 
    INNER JOIN [GDI-193-DEV].sys.schemas s ON t.schema_id = s.schema_id 
    INNER JOIN [GDI-193-DEV].sys.syscomments sc ON so.id = sc.id 
WHERE so.type = 'TR' 

問題是如果觸發源代碼的長度更超過4,000個字符,它會跨越sys.syscomments中的兩條記錄。

因此,例如,如果觸發源是4,700個字符,它將分佈在sys.syscomments中的2條記錄中。第一個記錄中的sys.syscomments.TEXT長度爲4,000,而其餘的700個字符將被放入另一個記錄。

這對我造成了問題,因爲我試圖比較兩個數據庫之間的完整觸發源代碼。

這看起來像是一些奇怪的行爲。我錯過了什麼嗎?有沒有不同的方式來獲得避免這個問題的源代碼?

由於提前,

+0

可以更好地問上DBA。 –

+0

你可以嘗試使用'object_definition(so.object_id)'而不是加入syscomments,我沒有測試過它,但它可能不會限制在4000 –

回答

1

我有同樣的問題,並發現有另一種方式來獲得修剪的定義。嘗試,如果你的觸發器顯示整個代碼,然後你可以用自己的方式joinning這對其他系統表/視圖:

select top 100 
    * 
from sys.sql_modules 
where 1=1 
    and definition like '%trigger%' 
+0

爲什麼會有'1 = 1'? –

+0

@AshBurlaczenko這只是我的習慣:) –

+0

我能確定定義中會包含字符串'trigger'嗎? SQL Server是否把它放在? – user2135970

1

嘗試使用object_definition這樣的:

SELECT so.name AS trigger_name, 
    s.name AS table_schema, 
    t.name AS table_name, 
    object_definition(so.object_id) AS trigger_content 
FROM [GDI-193-DEV].dbo.sysobjects so 
    INNER JOIN [GDI-193-DEV].sys.tables t ON so.parent_obj = t.object_id 
    INNER JOIN [GDI-193-DEV].sys.schemas s ON t.schema_id = s.schema_id 
WHERE so.type = 'TR'