2010-03-16 2 views
17

Мне понадобились строки хранимых процедур, чтобы иметь возможность отслеживать, есть ли у меня ссылка на какую-либо функцию, процедуру или таблицу или иногда пытаться найти что-то внутри кода sp.Где хранит код хранимой процедуры SQL Server?

Где SQL Server хранит код процедуры?

ответ

28

Используйте sys.sql_modules, потому что definition это nvarchar(max), потому что он не будет усекать длинный код.

В INFORMATION_SCHEMA.ROUTINES столбец ROUTINE_DEFINITION это только nvarchar(4000), поэтому, если вы попытаетесь просмотреть текст длинной процедуры, и вы увидите, что она усечена.

Используется для поиска текста в любой процедуры, вид, функции:

SELECT DISTINCT 
    o.name AS Object_Name,o.type_desc 
    FROM sys.sql_modules  m 
     INNER JOIN sys.objects o ON m.object_id=o.object_id 
    WHERE m.definition Like '%'[email protected]+'%' 
    ORDER BY 2,1 

используется для просмотра текста данной процедуры, вид, функции:

select * from sys.sql_modules where object_id=object_id('YourProcedure') 
+1

sys.sql_modules кажется почти неизвестным. это истинное решение sql05 +, а не infoschema и syscomments – devio

+0

@devio, оно находится в BOL: http://msdn.microsoft.com/en-us/library/ms175081.aspx, поэтому я не уверен, почему никто знает об этом. Если вы хотите полное определение, то это 'THE' решение. –

+0

Почему вы использовали предложение DISTINCT, может ли быть несколько строк для любого объекта? – Zia

0

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

+0

Непростой способ поиска содержимого. –

1

Если вы используете SQL Server Management Studion, вы можете щелкнуть правой кнопкой мыши по нужной вам базе данных, а затем нажать «Задачи -> Сгенерировать скрипты».

Там вы можете сгенерировать скрипт со всеми SP в одном файле, отделить файлы или непосредственно в окне запроса и выполнить поиск/изменение того, что вы хотите.

Надеюсь, это поможет.

(это для SQL Server 2008, но я думаю, что 2005 эта функциональность тоже)

EDIT:

Вы также можете увидеть один единственный код SP, следуя по этому пути «YourDB -> Programmability - > Хранимые процедуры ", затем щелкните правой кнопкой мыши на SP, который хотите просмотреть, и нажмите« Изменить », и окно запроса открывается с кодом.

4

Он хранил его в таблицах системы схемы:

SELECT * FROM INFORMATION_SCHEMA.ROUTINES 

См MSDN о INFORMATION_SCHEMA.ROUTINES зрения:

ms-help://MS.SQLCC.v10/MS.SQLSVR.v10.en/s10de_6tsql/html/c75561b2-c9a1-48a1-9afa-a5896b6454cf.htm 

Для поиска контента на это, вы можете сделать follwing:

SELECT * FROM INFORMATION_SCHEMA.ROUTINES 
WHERE ROUTINE_DEFINITION LIKE '%search_string%' 
+2

в INFORMATION_SCHEMA.ROUTINES ROUTINE_DEFINITION - это только nvarchar (4000), поэтому попробуйте просмотреть текст длинной процедуры, и вы увидите, что она усечена. См. Мой ответ, как получить полный код длинных процедур. –

1

Если вы пытаетесь найти ссылки на другие объекты, вы можете запустить запрос у, как это:

SELECT * FROM syscomments , текст LIKE '% SearchString%'

Это будет возвращать какие-либо объекты в базе данных, которые ссылаются на строку поиска. Затем вы можете посмотреть эти объекты, чтобы увидеть, какие хранимые процедуры (и представления и функции) делают это.

+2

syscomments.text - это nvarchar (4000) и, как результат, усекает все, что дольше. См. Мой ответ для системного представления, в котором используется столбец nvarchar (max), и, как результат, не будет обрезать –

+0

, он фактически не усекает, он просто создает несколько строк для любых слишком длинных процедур. Это определенно сложнее в использовании, если вы храните процедуры, которые так долго, и представление, на которое вы ссылались, определенно является лучшим решением. Конечно, если вы создаете индивидуальные процедуры длиной 4000+ символов, возможно, вы заслуживаете того, чтобы их заставили делать вещи, которые сложнее :) –

1

Просмотр зависимостей

В SQL Server Management Studio, щелкните правой кнопкой мыши на столе, и выберите "Просмотр зависимостей". Вы увидите, каждый объект, который ссылается на таблицу

information_schema

Реальный код для ХП, вид, ограничения и т.д. хранится в SysComments. Вы должны запросить это, используя представления, представленные в схеме Information_Schema. Вот все компоненты Information_Schema.

3

Вы можете использовать

select object_definition(object_id(routine_name)) from information_schema.routines 

или

select object_definition(object_id) from sys.objects where name = 'foo' 

или даже

select object_definition(object_id('foo')); -- 'foo' is the table name 

Эти версии никогда не усекается.

Смежные вопросы