SQL中print、sp_helptext的限制與擴(kuò)展
在SQL中,使用動態(tài)SQL是很常見的。有些復(fù)雜的計算,或是存儲過程,代碼很長,中間可能有多次執(zhí)行SQL語句。而調(diào)試拼串的SQL語句卻是件痛苦的事,很難看出來運(yùn)行的語句是什么。所以我會經(jīng)常使用print這個命令把運(yùn)行前的語句打印到屏幕上,然后復(fù)制出來到另一個窗口進(jìn)行調(diào)試、修改,這樣就比較方便了。但是這個print命令有一些限制,在單字節(jié)符集下,最大只能打印打印8000個字符的長度,而在雙字節(jié)字符集是4000個。
以下存儲過程可以打印完整的信息,不受長度的限制。代碼如下:
IF OBJECT_ID(N'sp_print_all') IS NOT NULL BEGIN DROP PROCEDURE sp_print_all END GO CREATE PROCEDURE sp_print_all (@dynamic_sql NVARCHAR(MAX)) AS DECLARE @start INT DECLARE @len INT SET @start = 1 SET @len = 4000 WHILE (@start < LEN(@dynamic_sql)) BEGIN PRINT SUBSTRING(@dynamic_sql, @start, @len) SET @start = @start + @len END PRINT SUBSTRING(@dynamic_sql, @start, @len) GO
code-1
還有一個存儲sp_helptext,可以查詢存儲過程,函數(shù)等代碼,使用起來也比較方便,但也有長度的限制,而且打印出來的格式跟源代碼的格式有些對應(yīng)不上。寫了一個自定義存儲過程來代替,代碼如下:
IF OBJECT_ID(N'sp_helptext_user') IS NOT NULL BEGIN DROP PROCEDURE sp_helptext_user END GO 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
code-2
當(dāng)然,查看源代碼有多種方法,可以在SSMS上操作等,看個人習(xí)慣或方便操作了。
詳解sp_helptext
顯示規(guī)則、默認(rèn)值、未加密的存儲過程、用戶定義函數(shù)、觸發(fā)器或視圖的文本。
語法
sp_helptext [ @objname = ] 'name'
參數(shù)
[@objname =] 'name'
對象的名稱,將顯示該對象的定義信息。對象必須在當(dāng)前數(shù)據(jù)庫中。name 的數(shù)據(jù)類型為 nvarchar(776),沒有默認(rèn)值。
返回代碼值
0(成功)或 1(失?。?/p>
注釋
sp_helptext 在多個行中顯示用來創(chuàng)建對象的文本,其中每行有 Transact-SQL 定義的 255 個字符。這些定義只駐留在當(dāng)前數(shù)據(jù)庫的 syscomments 表的文本中。
權(quán)限
執(zhí)行權(quán)限默認(rèn)授予 public 角色。
示例
下面的示例顯示 employee_insupd 觸發(fā)器的文本,該觸發(fā)器在數(shù)據(jù)庫 pubs 中。
USE pubs EXEC sp_helptext 'employee_insupd'
版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場,如有內(nèi)容涉嫌侵權(quán),請聯(lián)系alex-e#qq.com處理。