السلام عليكم و رحمة الله :
من المعروف لدى مبرمجي T-Sql أن الإجرائيات المخزنة يخزن نصها في جدول النظام SysComments اللي قد يخزن نص الإجرائية في أكثر من سجل عندما تكون طويلة مثل :
إجرائيات النظام Sp_Help على سبيل المثال و غيرها الكثير .. فما الحل كي نعرضها مثلاً في سجل واحد عن طريق مثلاً أداة برمجية
خارجية (فيجوال ستوديو مثلاً) في مربع نص من سجل واحد ؟؟ 8-)
مسألة تحير .. قد يفكر البعض بعمل حلقة على سجلات نص الإجرائية و كتابتها في الأداة (مربع نص) ..
و السؤال لمادا نقوم بدلك و نحن نملك طريقة من لب الـSql Server تمكننا من جمع كم كبير من النص في حقل من نوع NText أو Text كما تحدثت في درس سابق ؟؟
إليك هده الإجرائية الظريفة قمت ببرمجتها و التي تقوم بوضع نص الإجرائية مهما كان عدد السجلات التي تشغلها في الجدول SysComments في سجل واحد فقط .. ;)
Proc [dbo].[Procedure_Text]
@Proc_Name nvarchar(128) = 'Procedure_Text' ,
@DB nvarchar(128) = 'master' ,
@Drop_Temp_TB bit = 1
AS
if((select count(*) from tempdb..SysObjects where name = 'Proc_Text' and XType='U') > 0)
DRop Table tempdb..Proc_Text
set @DB = RTrim(LTRim(@DB))
if(@DB <> '')
set @DB = @DB + '..'
print @DB
exec
('
select '+ @DB +'syscomments.id,text ,name from '+ @DB +'syscomments
Inner Join '+ @DB +'sysobjects ON '+ @DB +'syscomments.id = '+ @DB +'sysobjects.id
Where
'+ @DB +'sysobjects.name = ''' + @proc_Name + '''
')
create Table #M(Txt nvarchar(4000))
Create Table tempdb..Proc_Text(TXT NText)
insert Into #M exec('select text from '+ @DB +'syscomments
Inner Join '+ @DB +'sysobjects ON '+ @DB +'syscomments.id = '+ @DB +'sysobjects.id
Where '+ @DB +'sysobjects.name = ''' + @proc_Name + '''')
insert Into tempdb..Proc_Text(TXT) values('1')
Declare @Part nvarchar(4000),@i int , @Ptr VarBinary(32), @q nvarchar(2000)
Select @i = 0 , @q = '' , @Ptr = TextPtr(TXT) From tempdb..Proc_Text
declare C cursor For Select Txt from #M
open C
Fetch Next From C Into @Part
While @@Fetch_Status = 0
Begin
UpdateText tempdb..Proc_Text.TXT @Ptr @i 0 @Part
set @q = 'UpdateText tempdb..Proc_Text.TXT '
Select @Ptr = TextPtr(TXT) From tempdb..Proc_Text
print ('-----------' + Char(13) + @q)
print @Ptr
print ' ' + cast(@i as nvarchar(5)) + ' 0 ' + Char(13) + '-----------'
Set @i = @i + 4000
print '---------------' + Char(13) + cast(@i as Nvarchar(5)) + Char(13) + '---------------' + Char(13)
Fetch Next From C Into @Part
End
Close C
DeAllocate C
Select TXT From tempdb..Proc_Text
if(@Drop_Temp_TB = 1)
Drop Table tempdb..Proc_Text---------------------------------------------------
إختبار :
[Procedure_Text] 'sp_help'
أرجو تقييمها .. :rolleyes: