Solución:
;WITH ROUTINES AS (
-- CANNOT use INFORMATION_SCHEMA.ROUTINES because of 4000 character limit
SELECT o.type_desc AS ROUTINE_TYPE
,o.[name] AS ROUTINE_NAME
,m.definition AS ROUTINE_DEFINITION
FROM sys.sql_modules AS m
INNER JOIN sys.objects AS o
ON m.object_id = o.object_id
)
SELECT SUM(LEN(ROUTINE_DEFINITION))
FROM ROUTINES
Una forma ligeramente mejor que contar los caracteres es utilizar esquemas de información. Puede sumar la longitud de cada definición de rutina como (tenga en cuenta que cada definición de rutina tendrá un máximo de 4000 caracteres, consulte a continuación un método que no tiene esta restricción):
select Sum(Len(Routine_Definition)) from information_schema.routines where routine_type="PROCEDURE"
O puede devolver la longitud de cada sp.
select Len(Routine_Definition), * from information_schema.routines where routine_type="PROCEDURE"
Es poco probable que la longitud de sus procedimientos almacenados sea el problema. Por lo general, quedarse sin espacio con una base de datos se debe a cosas como no hacer una copia de seguridad del archivo de registro (y luego reducirlo usando dbcc shrinkfile o dbcc shrinkdatabase).
En Sql 2000, aquí hay una rutina que proporcionaría la longitud sin el límite de 4000 caracteres anterior:
DECLARE @Name VarChar(250) DECLARE RoutineCursor CURSOR FOR select Routine_Name from information_schema.routines where routine_type="PROCEDURE" DECLARE @Results TABLE ( SpName VarChar(250), SpLength Int ) CREATE TABLE ##SpText ( SpText VarChar(8000) ) OPEN RoutineCursor FETCH NEXT FROM RoutineCursor INTO @Name WHILE @@FETCH_STATUS = 0 BEGIN INSERT INTO ##SpText (SpText) EXEC sp_helptext @Name INSERT INTO @Results (SpName, SpLength) (SELECT @Name, Sum(Len(SpText)) FROM ##SpText) TRUNCATE TABLE ##SpText FETCH NEXT FROM RoutineCursor INTO @Name END CLOSE RoutineCursor DEALLOCATE RoutineCursor DROP TABLE ##SpText SELECT SpName, SpLength FROM @Results ORDER BY SpLength DESC SELECT Sum(SpLength) FROM @Results
La solución de Dave_H alcanza un límite de 4000 caracteres en la tabla information_schema.routines
Pruebe esto, primero genere la tabla a con el texto completo de los sprocs, luego sume las longitudes de los caracteres.
--create a temp table to hold the data
create table ##sptext (sptext varchar(1000))
go
--generate the code to insert the full text of your sprocs
select 'insert into ##sptext (sptext) exec sp_helptext '''+specific_name+''';'
from information_schema.routines
where routine_type="PROCEDURE"
go
/*Copy the output back to your query analyzer and run it*/
--now sum the results
select sum(len(sptext))
from ##sptext