2009-02-04 44 views
4

我想查詢存儲過程定義的列表,使用information_schema.routines存在於一個數據庫中,但不存在於另一個數據庫中。MSSQL:你如何使用代碼腳本創建存儲過程?

SELECT 
    t1.Routine_Definition 
FROM 
    [server1].MyDatabase.INFORMATION_SCHEMA.Routines t1 
LEFT JOIN 
    [server2].MyDatabase.INFORMATION_SCHEMA.Routines t2 ON t1.Routine_Name = t2.Routine_Name 
WHERE 
    t2.Routine_Name is null 


這讓我在單行查詢定義,所以當我有這樣

--Some comment 
SELECT Column 
FROM Somewhere 

的SQL註釋被註釋掉了,我不能用定義來創建的SP。

如何用恰當的換行符解析它?

有沒有更好的方法來獲得這些腳本(使用代碼)?

+0

正在爲您編程一個選項,還是必須基於T-SQL?例如,它可能是一個在後臺運行並吐出腳本的VB.NET程序,或者它甚至會自己創建丟失的對象? – SqlRyan 2009-02-04 20:45:24

回答

9

存儲過程僅在Management Studio的一行中顯示。如果運行結果的文本查詢,使用以下,你會得到正確的換行符:

declare @sql varchar(8000) -- varchar(max) in SQL 2005+ 

SELECT 
     @sql = t1.Routine_Definition 
FROM 
     INFORMATION_SCHEMA.Routines t1 

print @sql 
+1

確實如此,除非您的存儲過程長於8000個字符。 – SqlRyan 2009-02-04 20:44:38

-1

我認爲獲取存儲過程最簡單的方法是使用內置於SQL Server Management Studio中的導入/導出實用程序。從那裏,您可以將您的存儲過程對象導出到代碼窗口或可以立即運行的文件。

+2

我不是在尋找最簡單的方法。我想用它來創建一個動態腳本,它將創建我的腳本而不使用GUI並選擇要編寫腳本的SP。 – ctrlShiftBryan 2009-02-04 20:35:58

1
DECLARE MY_CURSOR Cursor 
FOR 

SELECT 
     t1.Routine_Definition 
FROM 
     [server1].MyDatabase.INFORMATION_SCHEMA.Routines t1 
LEFT JOIN 
     [server2].MyDatabase.INFORMATION_SCHEMA.Routines t2 ON t1.Routine_Name = t2.Routine_Name 
WHERE 
     t2.Routine_Name is null AND 
     LEN(t1.Routine_Definition) < 4000 



Open My_Cursor 
DECLARE @sql VARCHAR(MAX) 

FETCH NEXT FROM MY_Cursor INTO @sql 
While (@@FETCH_STATUS <> -1) 
BEGIN 
IF (@@FETCH_STATUS <> -2) 

Print @sql 

FETCH NEXT FROM MY_CURSOR INTO @sql 
END 
CLOSE MY_CURSOR 
DEALLOCATE MY_CURSOR 
GO 

這裏是我是如何實現CK的解決方案......

的INFORMATION_SCHEMA視圖僅返回定義中的前4000個字符。 (理想情況下,你不會有那麼長的SP)你會想要手動或其他方式編寫腳本。