PRINT:單次最多 8000 字元(雙位元組字符集 4000),長動態 SQL 截斷。sp_helptext:單行 255 字元,格式錯亂,同樣受長度限制。sp_print_allCREATE PROCEDURE sp_print_all @dynamic_sql NVARCHAR(MAX)
AS
DECLARE @start INT = 1, @len INT = 4000;
WHILE @start < LEN(@dynamic_sql)
BEGIN
PRINT SUBSTRING(@dynamic_sql, @start, @len);
SET @start += @len;
END
PRINT SUBSTRING(@dynamic_sql, @start, @len);
GO
呼叫:EXEC sp_print_all @dynamic_sql = N'超長 SQL 字串...';
sp_helptext_userCREATE PROCEDURE sp_helptext_user @obj_name NVARCHAR(200) = ''
AS
SET NOCOUNT ON;
DECLARE @text NVARCHAR(MAX), @i INT, @text2 NVARCHAR(MAX), @db_name SYSNAME, @obj_id BIGINT;
SET @db_name = PARSENAME(@obj_name, 3);
IF @db_name IS NULL SET @db_name = DB_NAME();
ELSE IF @db_name <> DB_NAME() BEGIN RAISERROR(15250, -1, -1); RETURN 1; END
SET @obj_id = OBJECT_ID(@obj_name);
IF @obj_id IS NULL BEGIN RAISERROR(15009, -1, -1, @obj_name, @db_name); RETURN 1; END
SELECT @text = [definition] FROM sys.all_sql_modules WHERE [object_id] = @obj_id;
WHILE LEN(@text) > 2000
BEGIN
SET @i = CHARINDEX(CHAR(13), @text, 2000); -- 找換行符
SET @text2 = LEFT(@text, @i);
SET @text = SUBSTRING(@text, @i + 2, LEN(@text));
PRINT @text2;
END
PRINT @text;
SET NOCOUNT OFF;
GO
優點:按換行符切割,保留原始縮排與註解,無長度限制。
EXEC sp_helptext 'employee_insupd';
syscomments(舊版)或 sys.sql_modules。SELECT OBJECT_DEFINITION(OBJECT_ID('schema.proc')); 單行回傳,配合編輯器格式化。SELECT [definition] FROM sys.sql_modules WHERE object_id = OBJECT_ID('schema.proc');