2010-03-16 74 views

Trả lời

28

Sử dụng sys.sql_modulesdefinitionnvarchar(max) vì nó sẽ không cắt ngắn mã.

Trong INFORMATION_SCHEMA.ROUTINES cột ROUTINE_DEFINITION chỉ là nvarchar(4000) vì vậy nếu bạn thử xem văn bản của quy trình dài và bạn sẽ thấy nó bị cắt bớt.

Sử dụng này để tìm kiếm văn bản trong bất kỳ thủ tục, xem, chức năng:

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 

sử dụng này để xem nội dung của một thủ tục, xem, chức năng nhất định:

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

sys.sql_modules dường như gần như không xác định. nó là giải pháp sql05 + đúng, chứ không phải là infoschema và syscomments – devio

+0

@devio, nó nằm trong BOL: http://msdn.microsoft.com/en-us/library/ms175081.aspx, vì vậy tôi không chắc tại sao không ai biết về nó. Nếu bạn muốn định nghĩa đầy đủ, thì đó là giải pháp 'THE'. –

+0

lý do tại sao bạn sử dụng mệnh đề DISTINCT, có thể có nhiều hàng cho bất kỳ đối tượng nào không? – Zia

0

Nếu bạn chỉ đang cố gắng xem mã thủ tục được lưu trữ, bạn vào thư mục progammabiltity trong DB của bạn và tất cả chúng sẽ được lưu trữ trong đó theo các thủ tục được lưu trữ.

+0

Không phải là cách dễ dàng để tìm kiếm nội dung. –

1

Nếu bạn sử dụng SQL Server Management Studion, bạn có thể nhấp chuột phải vào cơ sở dữ liệu bạn muốn, sau đó nhấp vào "Tác vụ -> Tạo tập lệnh".

Ở đó bạn có thể tạo tập lệnh với tất cả SP trong một tệp, tệp được phân tách hoặc trực tiếp đến cửa sổ truy vấn và tìm kiếm/thay đổi những gì bạn muốn.

Hy vọng điều này sẽ hữu ích.

(đây là cho SQL Server 2008, nhưng tôi nghĩ rằng 2005 có chức năng này quá)

EDIT:

Bạn cũng có thể thấy một mã SP duy nhất, bằng cách làm theo con đường này "YourDB -> Khả năng lập trình - > Thủ tục lưu trữ ", sau đó nhấp chuột phải vào SP bạn muốn xem và nhấp vào" Sửa đổi "và cửa sổ truy vấn được mở bằng mã.

4

Nó lưu trữ nó bên trong các bảng sơ đồ hệ thống:

SELECT * FROM INFORMATION_SCHEMA.ROUTINES 

Xem MSDN về INFORMATION_SCHEMA.ROUTINES xem:

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

Để tìm kiếm nội dung về vấn đề này, bạn có thể làm follwing:

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

trong INFORMATION_SCHEMA.ROUTINES ROUTINE_DEFINITION chỉ là nvarchar (4000) vì vậy hãy thử xem văn bản của một quy trình dài và bạn sẽ thấy nó bị cắt ngắn. Xem câu trả lời của tôi về cách lấy mã hoàn chỉnh các thủ tục dài. –

1

Nếu bạn đang cố gắng tìm kiếm các tham chiếu đến các đối tượng khác, thì bạn có thể chạy một quer y như thế này:

SELECT * TỪ syscomments ĐÂU TEXT LIKE '% searchstring%'

này sẽ trả lại bất kỳ đối tượng trong cơ sở dữ liệu mà tham khảo các chuỗi tìm kiếm. Sau đó bạn có thể xem các đối tượng này để xem các thủ tục được lưu trữ (và các khung nhìn và các hàm) đang làm như thế.

+2

syscomments.text là nvarchar (4000) và kết quả là sẽ cắt ngắn bất cứ thứ gì dài hơn. Xem câu trả lời của tôi cho chế độ xem hệ thống sử dụng cột nvarchar (tối đa) và kết quả là sẽ không cắt bớt –

+0

nó không thực sự cắt ngắn, nó chỉ tạo nhiều hàng cho bất kỳ quy trình nào quá dài. Nó chắc chắn khó sử dụng hơn nếu bạn đã lưu trữ các quy trình dài và quan điểm bạn đã thực hiện tham chiếu đến chắc chắn là một giải pháp tốt hơn. Tất nhiên, nếu bạn đang tạo các thủ tục riêng lẻ dài hơn 4000 ký tự, có lẽ bạn xứng đáng bị buộc phải làm những việc khó khăn hơn :) –

1

Xem Dependencies

Trong SQL Server Management Studio, nhấp chuột phải vào một bảng, và chọn "View Dependencies". Bạn sẽ thấy tất cả các đối tượng tham chiếu đến bảng

INFORMATION_SCHEMA

Mã thực tế cho một proc, xem, hạn chế lưu trữ, vv được lưu trữ trong SysComments. Bạn nên truy vấn điều này bằng cách sử dụng các khung nhìn được cung cấp trong lược đồ Information_Schema. Dưới đây là tất cả các thành phần của Information_Schema.

3

Bạn có thể sử dụng

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

hoặc

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

hoặc thậm chí

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

Những phiên bản không bao giờ được cắt ngắn.

Các vấn đề liên quan