2011-10-26 89 views
2

我有40個左右的存儲過程,我希望能夠在紙張上打印出來並重構,然後對過程進行更改。我遇到了幾種不同的可能性,但沒有一個符合我的要求,但是稍微調整就可以解決這個問題。第一個從sql server 2005存儲過程打印源代碼

select 
    text 
from 
    syscomments 
where 
    id in (select id from sysobjects where xtype='p' and name LIKE 'qscore_Corp%') 

但這會返回單行上未格式化的所有代碼。

使用sp_helptext也是一個選項,但我還沒有想出如何將多個連接成一個長文本表。

我的目標是讓我可以從一個文本文件中打印這40個程序的源代碼,並使用我在每個程序中使用的格式。

解決:::由馬丁再次感謝。 我對他的解決方案做了一個小小的調整,拉我需要的特效。 DECLARE @stored_procedure_code爲nvarchar(MAX) SET @stored_procedure_code = ''

SELECT @stored_procedure_code = @stored_procedure_code + '' + ISNULL(OBJECT_DEFINITION(object_id),'') 
    FROM sys.procedures WHERE name LIKE 'qscore_Corp%' 

    SELECT @stored_procedure_code AS [processing-instruction(x)] FOR XML PATH('') 
+2

我不記得所有的菜單的等,並沒有管理Studio在這裏,但是...如果您在數據庫中編寫對象腳本,則可以選擇使用或不使用前面的DROP語句來編寫所有存儲過程的腳本。 – MatBailie

回答

3

DECLARE @stored_procedure_code nvarchar(MAX) = '' 

SELECT @stored_procedure_code = @stored_procedure_code + ' 
/*****************************************************************************/ 
GO 

' + ISNULL(OBJECT_DEFINITION(object_id),'') 
FROM sys.procedures 
WHERE object_id IN (object_id('foo'),object_id('foo_bar')) 

SELECT @stored_procedure_code AS [processing-instruction(x)] FOR XML PATH('') 
+0

+1這是一個非常性感的解決方案! – Yuck

+0

令人驚歎的解決方案我將在我的原始代碼中發佈,我最終只使用作爲參考對我做的調整,但非常感謝你的想法馬丁。 –

+1

@MichaelCole - 我猜你會說'name LIKE'usp_foo%'?我使用'object_id'的唯一原因是,如果你在不同的模式中有相同的對象名 - tbh我沒有注意到你在原代碼中使用了'LIKE'。 –

0
SELECT definition 
    FROM sys.sql_modules m 
     INNER JOIN sys.objects o 
      ON m.object_id = o.object_id 
    WHERE o.type = 'P' 
     AND o.name LIKE 'qscore_Corp%' 
+0

一個很好的解決方案,導致與我原來的查詢(第一個不是解決的問題)相同的結果集只有問題與此是我試圖打印出來,以便我可以在紙上進行更改,然後返回到數據庫並進行更改,並使用此解決方案沒有格式。 –

相關問題