|
|
1
17
|
|
2
4
一种比计数字符稍好的方法是使用information schema.croutines。您可以将每个例程定义的长度相加为(请注意,每个例程定义最多为4000个字符,请参阅下文了解没有此限制的方法): select Sum(Len(Routine_Definition)) from information_schema.routines where routine_type = 'PROCEDURE' 或者,您可以返回每个sp的长度 select Len(Routine_Definition), * from information_schema.routines where routine_type = 'PROCEDURE' 存储过程的长度不太可能是问题所在。通常,数据库空间不足是由于没有备份日志文件(然后使用dbcc shrinkfile或dbcc shrnkdatabase缩小日志文件)。 在Sql 2000中,有一个例程可以提供长度,而不受上述4000个字符的限制: 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
|
|
|
3
2
需要使用DATALENGTH而不是LEN来获取字节数而不是字符数,因为sys.sql_modules目录视图的定义列是NVARCHAR(MAX),即Unicode
|
|
|
4
2
改进Cade Roux答案:
|
|
|
5
2
Dave_H的解决方案在information_schema.routines表中达到了4000个字符的限制 尝试一下,首先生成一个包含sproc全文的表,然后对字符长度求和。
|