SQL中print、sp_helptext的限制與擴(kuò)展
在SQL中,使用動(dòng)態(tài)SQL是很常見(jiàn)的。有些復(fù)雜的計(jì)算,或是存儲(chǔ)過(guò)程,代碼很長(zhǎng),中間可能有多次執(zhí)行SQL語(yǔ)句。而調(diào)試拼串的SQL語(yǔ)句卻是件痛苦的事,很難看出來(lái)運(yùn)行的語(yǔ)句是什么。所以我會(huì)經(jīng)常使用print這個(gè)命令把運(yùn)行前的語(yǔ)句打印到屏幕上,然后復(fù)制出來(lái)到另一個(gè)窗口進(jìn)行調(diào)試、修改,這樣就比較方便了。但是這個(gè)print命令有一些限制,在單字節(jié)符集下,最大只能打印打印8000個(gè)字符的長(zhǎng)度,而在雙字節(jié)字符集是4000個(gè)。
以下存儲(chǔ)過(guò)程可以打印完整的信息,不受長(zhǎng)度的限制。代碼如下:
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
還有一個(gè)存儲(chǔ)sp_helptext,可以查詢存儲(chǔ)過(guò)程,函數(shù)等代碼,使用起來(lái)也比較方便,但也有長(zhǎng)度的限制,而且打印出來(lái)的格式跟源代碼的格式有些對(duì)應(yīng)不上。寫(xiě)了一個(gè)自定義存儲(chǔ)過(guò)程來(lái)代替,代碼如下:
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上操作等,看個(gè)人習(xí)慣或方便操作了。
詳解sp_helptext
顯示規(guī)則、默認(rèn)值、未加密的存儲(chǔ)過(guò)程、用戶定義函數(shù)、觸發(fā)器或視圖的文本。
語(yǔ)法
sp_helptext [ @objname = ] 'name'
參數(shù)
[@objname =] 'name'
對(duì)象的名稱,將顯示該對(duì)象的定義信息。對(duì)象必須在當(dāng)前數(shù)據(jù)庫(kù)中。name 的數(shù)據(jù)類(lèi)型為 nvarchar(776),沒(méi)有默認(rèn)值。
返回代碼值
0(成功)或 1(失敗)
注釋
sp_helptext 在多個(gè)行中顯示用來(lái)創(chuàng)建對(duì)象的文本,其中每行有 Transact-SQL 定義的 255 個(gè)字符。這些定義只駐留在當(dāng)前數(shù)據(jù)庫(kù)的 syscomments 表的文本中。
權(quán)限
執(zhí)行權(quán)限默認(rèn)授予 public 角色。
示例
下面的示例顯示 employee_insupd 觸發(fā)器的文本,該觸發(fā)器在數(shù)據(jù)庫(kù) pubs 中。
USE pubs EXEC sp_helptext 'employee_insupd'
相關(guān)文章
淺談SQLServer的ISNULL函數(shù)與Mysql的IFNULL函數(shù)用法詳解
本篇文章是對(duì)SQLServer的ISNULL函數(shù)與Mysql的IFNULL函數(shù)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06深入SQLServer中ISNULL與NULLIF的使用詳解
本篇文章是對(duì)SQLServer中ISNULL與NULLIF的使用進(jìn)行了詳細(xì)分析介紹,需要的朋友參考下2013-06-06SQL Server中將查詢結(jié)果轉(zhuǎn)換為Json格式腳本分享
這篇文章主要介紹了SQL Server中將查詢結(jié)果轉(zhuǎn)換為Json格式腳本分享,本文直接給出實(shí)現(xiàn)代碼,需要的朋友可以參考下2015-02-02SQL Server查找表名或列名中包含空格的表和列實(shí)例代碼
這篇文章主要給大家介紹了關(guān)于SQL Server如何查找表名或列名中包含空格的表和列的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧2018-09-09SQL?Server表空間碎片化回收的實(shí)現(xiàn)
本文主要介紹了SQL?Server表空間碎片化回收的實(shí)現(xiàn),文中根據(jù)實(shí)例編碼詳細(xì)介紹的十分詳盡,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03SQL Server誤區(qū)30日談 第15天 CheckPoint只會(huì)將已提交的事務(wù)寫(xiě)入磁盤(pán)
這個(gè)誤區(qū)是由于太多人對(duì)日志和恢復(fù)系統(tǒng)缺少全面的了解而存在已久。CheckPoint會(huì)將自上次CheckPoint以來(lái)所有在內(nèi)存中改變的頁(yè)寫(xiě)回磁盤(pán)(譯者注:也就是臟頁(yè)),或是在上一個(gè)CheckPoint讀入內(nèi)存的臟頁(yè)寫(xiě)入磁盤(pán)2013-01-01sqlserver 此數(shù)據(jù)庫(kù)沒(méi)有有效所有者錯(cuò)誤的解決方法
此數(shù)據(jù)庫(kù)沒(méi)有有效所有者,因此無(wú)法安裝數(shù)據(jù)庫(kù)關(guān)系圖支持對(duì)象。若要繼續(xù),請(qǐng)首先使用“數(shù)據(jù)庫(kù)屬性”對(duì)話框的“文件”頁(yè)或Alter AUTHORIZATION語(yǔ)句將數(shù)據(jù)庫(kù)所有者設(shè)置為有效登錄名,然后再添加數(shù)據(jù)庫(kù)關(guān)系圖支持對(duì)象。2010-04-04MSSQL轉(zhuǎn)MYSQL,gb2312轉(zhuǎn)utf-8無(wú)亂碼解決方法
MSSQL轉(zhuǎn)MYSQL,gb2312轉(zhuǎn)utf-8無(wú)亂碼解決方法,需要的朋友可以參考下。2010-06-06