2008-11-14 22 views
15

Tôi muốn truy vấn trả về danh sách tất cả các thủ tục được lưu trữ (người dùng) trong cơ sở dữ liệu theo tên, với số dòng mã cho mỗi thủ tục .Truy vấn để liệt kê các thủ tục lưu sẵn SQL Server cùng với các dòng mã cho mỗi thủ tục

ví dụ:

sp_name  lines_of_code 
-------- ------------- 
DoStuff1 120 
DoStuff2 50 
DoStuff3 30 

Bất kỳ ý tưởng làm thế nào để làm điều này?

+0

How are you đếm "dòng"? Số lượng ký tự tùy ý, số dòng/dòng vận chuyển, hoặc cái gì? –

+0

Lợi nhuận dòng/vận chuyển dòng - giống như bạn sẽ thấy trong Mgt Studio khi bạn viết CREATE PROC cho proc. Nhưng nó không cần phải chính xác 100%. –

+0

Chỉ đủ tốt để có được một ý tưởng thô nơi sự phức tạp trong cơ sở dữ liệu. –

Trả lời

45
select t.sp_name, sum(t.lines_of_code) - 1 as lines_ofcode, t.type_desc 
from 
(
    select o.name as sp_name, 
    (len(c.text) - len(replace(c.text, char(10), ''))) as lines_of_code, 
    case when o.xtype = 'P' then 'Stored Procedure' 
    when o.xtype in ('FN', 'IF', 'TF') then 'Function' 
    end as type_desc 
    from sysobjects o 
    inner join syscomments c 
    on c.id = o.id 
    where o.xtype in ('P', 'FN', 'IF', 'TF') 
    and o.category = 0 
    and o.name not in ('fn_diagramobjects', 'sp_alterdiagram', 'sp_creatediagram', 'sp_dropdiagram', 'sp_helpdiagramdefinition', 'sp_helpdiagrams', 'sp_renamediagram', 'sp_upgraddiagrams', 'sysdiagrams') 
) t 
group by t.sp_name, t.type_desc 
order by 1 

Đã chỉnh sửa để bây giờ cũng sẽ hoạt động trong SQL Server 2000- 2008 và loại trừ sprocs liên quan đến Sơ đồ cơ sở dữ liệu và funcs (xuất hiện như đối tượng do người dùng tạo).

+0

Điều này dường như không hoạt động - nó truy xuất nhiều kết quả khác nhau cho cùng một thủ tục được lưu trữ. –

+0

Fred, tôi đã sửa nó để xử lý vấn đề thủ tục lưu trữ trùng lặp. Nhiều hàng syscomments được sử dụng cho các thủ tục lưu trữ lớn. –

+0

Cảm ơn GB, đó chính xác là những gì tôi cần. –

2

này làm việc cho MS-SQL 2000

SET NOCOUNT ON 

DECLARE @ProcName varchar(100) 
DECLARE @LineCount int 

DECLARE C CURSOR LOCAL FOR 
    SELECT o.name as ProcName FROM sysobjects o WHERE (o.xtype = 'P') ORDER BY o.name 

OPEN C 

CREATE TABLE #ProcLines ([Text] varchar(1000)) 

FETCH NEXT FROM C INTO @ProcName 

WHILE @@FETCH_STATUS = 0 
BEGIN 

    DELETE FROM #ProcLines 
    INSERT INTO #ProcLines EXEC('sp_helptext ' + @ProcName + '') 

    SELECT @LineCount = COUNT(*) FROM #ProcLines 

    PRINT @ProcName + ' Lines: ' + LTRIM(STR(@LineCount)) 

    FETCH NEXT FROM C INTO @ProcName 

END 

CLOSE C 

DEALLOCATE C 

DROP TABLE #ProcLines 
+0

Điều này giống như nó - sp_helptext có nghĩa là chúng ta khá gần với những gì QA sẽ trả lại. Nhưng nó cần phải đi trong một bảng để được thực sự hữu ích. –

+0

Bạn có thể dễ dàng thay đổi lệnh IN thành chèn vào bảng khác. –

+0

Cảm ơn DJ, đó là một cách thông minh để làm điều đó. –

7

FWIW, đây là một số khác:

SELECT o.type_desc AS ROUTINE_TYPE 
     ,QUOTENAME(s.[name]) + '.' + QUOTENAME(o.[name]) AS [OBJECT_NAME] 
     ,(LEN(m.definition) - LEN(REPLACE(m.definition, CHAR(10), ''))) AS LINES_OF_CODE 
FROM sys.sql_modules AS m 
INNER JOIN sys.objects AS o 
     ON m.[object_id] = o.[OBJECT_ID] 
INNER JOIN sys.schemas AS s 
     ON s.[schema_id] = o.[schema_id] 
-2
select * from sysobjects where type = 'p' 
+0

Điều này không cung cấp số dòng mã cho một sproc. –

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