2013-12-12 2 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' 

Проблема, если длина источника запуска кода больше чем 4000 символов, он заканчивается двумя записями в sys.syscomments.

Так, например, если источник триггера составляет 4700 символов, он будет распространяться на 2 записи в sys.syscomments. sys.syscomments.TEXT в первой записи будет иметь длину 4000, а остальные 700 символов будут помещены в другую запись.

Это вызывает проблемы для меня, поскольку я пытаюсь сравнить полный исходный код запуска между двумя базами данных.

Это похоже на странное поведение. Я что-то упускаю? Есть ли другой способ получить исходный код, который позволяет избежать этой проблемы?

Спасибо заранее,

+0

Может быть лучше спросил на дБА. –

+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

Могу ли я быть уверенным, что определение будет включать строку «триггер»? Включает ли 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' 
Смежные вопросы