首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server PRINT 與 sp_helptext 長度限制突破方案

     編輯:關於SqlServer

痛點

  • PRINT:單次最多 8000 字元(雙位元組字符集 4000),長動態 SQL 截斷。
  • sp_helptext:單行 255 字元,格式錯亂,同樣受長度限制。

方案 1:分批列印預存程序 sp_print_all

CREATE 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 字串...';

方案 2:完美保留格式的 sp_helptext_user

CREATE 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

優點:按換行符切割,保留原始縮排與註解,無長度限制。

原生 sp_helptext 參考

EXEC sp_helptext 'employee_insupd';
  • 適用於規則、預設值、未加密預存程序、函數、觸發器、視圖。
  • 輸出每行 255 字元,資料來源 syscomments(舊版)或 sys.sql_modules。

其他查看原始碼途徑

  • SSMS 物件總管 → 右鍵「修改」/「指令碼預存程序為」→ 「建立」。
  • SELECT OBJECT_DEFINITION(OBJECT_ID('schema.proc')); 單行回傳,配合編輯器格式化。
  • SELECT [definition] FROM sys.sql_modules WHERE object_id = OBJECT_ID('schema.proc');
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved