我有一堆存儲過程名稱。我想爲每個存儲過程導出創建腳本。什麼是最好的方式來做到這一點?t-sql存儲過程創建腳本
現在我手動選擇SSMS中的存儲過程並選擇"Script stored procedure as -> Drop and Create to"
。這似乎很乏味。我希望有更好的方法來解決這個問題。謝謝。
我有一堆存儲過程名稱。我想爲每個存儲過程導出創建腳本。什麼是最好的方式來做到這一點?t-sql存儲過程創建腳本
現在我手動選擇SSMS中的存儲過程並選擇"Script stored procedure as -> Drop and Create to"
。這似乎很乏味。我希望有更好的方法來解決這個問題。謝謝。
您可以在對象資源管理器中右鍵單擊數據庫並執行任務>生成腳本。
alt text http://i25.tinypic.com/2khmr8.png
這允許你選擇一大堆對象被腳本(例如表,視圖,存儲的特效),你可以存儲那些成一個單一的大SQL文件,或每個對象一個SQL文件。工作真的很好!
更新:,如果你想這樣做在SQL Server Management Studio中的應用程序,你可以使用這個SQL腳本來查找存儲的特效和定義 - 但是你不能有SQL Server的管理工作室寫出來的文件磁盤,這不起作用 - 但你可以將結果複製到例如Excel中。
SELECT
pr.name ,
pr.type_desc ,
pr.create_date ,
mod.definition
FROM sys.procedures pr
INNER JOIN sys.sql_modules mod ON pr.object_id = mod.object_id
WHERE pr.Is_MS_Shipped = 0
如果您選擇查看 - >摘要
然後點擊「存儲過程」,從對象資源管理器中它會爲你提供的,你可以按Ctrl/Shift鍵選擇所有的存儲過程的列表(選擇倍數)。 然後從那裏你可以創建所有的腳本,然後創建所有的腳本。這是我用SSMS發現的許多怪癖之一。
注意:另一個很好的功能是過濾器選項,允許您輕鬆篩選存儲/表格過程。只需右鍵單擊對象資源管理器即可調出菜單。
感謝您通知有關過濾器功能。從我這裏得到讚揚。 – stackoverflowuser 2010-07-20 17:43:07
要編寫符合特定條件的所有符合條件,您可以使用類似下面的內容。
DECLARE @t VARCHAR(max) = '';
SELECT @t = @t +
'If OBJECT_ID(''' + QUOTENAME(OBJECT_SCHEMA_NAME(object_id)) + '.' + QUOTENAME(OBJECT_NAME(object_id)) + ''',''p'') IS NOT NULL
DROP PROCEDURE ' + QUOTENAME(OBJECT_SCHEMA_NAME(object_id)) + '.' + QUOTENAME(OBJECT_NAME(object_id)) + '
GO
SET ANSI_NULLS '
+ CASE
WHEN uses_ansi_nulls = 1 THEN 'ON'
ELSE 'OFF'
END
+ '
GO
SET QUOTED_IDENTIFIER '
+ CASE
WHEN uses_quoted_identifier = 1 THEN 'ON'
ELSE 'OFF'
END
+ '
GO
' + definition + '
GO
'
FROM [sys].[sql_modules]
WHERE OBJECTPROPERTY (object_id,'IsProcedure')=1
AND OBJECT_NAME(object_id) LIKE '%some_patttern%'
/*Stops the long text from getting truncated in SSMS*/
SELECT @t AS [processing-instruction(x)]
FOR XML PATH('')
這是如何工作的?我是否需要將@t設置爲逗號分隔的存儲過程名稱列表? – stackoverflowuser 2010-07-20 17:36:47
@stack - 不,但你可以擺脫'LIKE',並使用'in'。 – 2010-07-20 17:39:51
真棒,正是我所需要的,不需要鼠標點擊。 – dividius 2012-03-28 08:50:58
Visual Studio 2008數據庫專業版和Visual Studio 2010 Professional(及更高版本)支持SQL Server 2005/2008的特殊項目類型。這些項目支持自動創建更改腳本,其中包含當前項目與指定目標數據庫之間的所有更改。
AFAIK RedGate也提供了這樣的工具,但我沒有任何經驗。
像這樣的東西會幫助你。
使用動態sql和遊標可以生成腳本,每個腳本都在一個單獨的文件中,擴展名爲.sql。
這個腳本會爲他們的名字都提到:在第所有的程序生成腳本:
DECLARE @name varchar(100)
DECLARE @Definition varchar(max)
DECLARE @sql varchar(300)
DECLARE @schema varchar(10)
CREATE TABLE TEMPTABLE (ID INT IDENTITY(1,1), def varchar(max))
DECLARE script CURSOR
FOR
SELECT OBJECT_NAME(SYS.SQL_MODULES.OBJECT_ID), [DEFINITION] FROM SYS.SQL_MODULES
INNER JOIN SYS.OBJECTS ON SYS.OBJECTS.OBJECT_ID = SYS.SQL_MODULES.OBJECT_ID WHERE SYS.OBJECTS.TYPE='P'
--AND [NAME] IN('SOME PROC 1','SOME PROC 2','SOME PROC 3','SOME PROC 4') --<------ Mention Proc names you want to generate scripts for
OPEN script
FETCH NEXT FROM script INTO @name, @Definition
WHILE @@FETCH_STATUS = 0
BEGIN
FETCH NEXT FROM script INTO @name, @Definition
SET @schema = (select SYS.SCHEMAS.[NAME] from SYS.OBJECTS
INNER JOIN SYS.SCHEMAS ON SYS.OBJECTS.SCHEMA_ID = SYS.SCHEMAS.SCHEMA_ID
WHERE SYS.OBJECTS.[NAME]='' + @name + '')
SET @sql = 'IF EXISTS (SELECT * FROM ' + (@schema) +
'.PROCEDURES WHERE [NAME] = ''' + @name + ''')' + CHAR(10)
SET @sql = @sql + 'DROP PROCEDURE ' + @schema + '.' + @name + CHAR(10) + 'GO' + CHAR(10)
PRINT @sql
INSERT INTO TEMPTABLE VALUES(@sql + @definition)
SET @Sql = ('BCP "SELECT TOP 1 def FROM TEMPTABLE ORDER BY ID DESC" queryout "D:\' + @name + '.sql" -c -T')
EXEC XP_CmdShell @Sql --<---- Export to file
END
CLOSE script
DEALLOCATE script
SELECT * FROM TEMPTABLE --<----------- Optional
DROP TABLE TEMPTABLE
C:\>BCP "Select '--'+pr.name,
pr.type_desc, pr.create_date, pr.modify_date, CHAR(13)+mod.definition
from DATABASE_NAME.sys.objects pr
INNER JOIN DATABASE_NAME.sys.sql_modules mod ON pr.object_id = mod.object_id
where type='p'" queryout "C:/output.sql" -c -T -S SERVER_NAME
從命令提示符下執行...它會將所有存儲過程返回到一個文件中,並帶有創建/修改日期的SP上的時間戳
以下內容將爲一組存儲過程名稱生成腳本。腳本將被保存爲一系列.sql文件。將過程的名稱插入到@Table中。
-- Script Multiple SPROC as drop and create
-- SPROCS to script
DECLARE @Table TABLE (Name VARCHAR(MAX));
INSERT INTO @Table (Name) VALUES ('StoredProcedure1'), ('StoredProcedure2')
-- Drop TempTable if extant: http://stackoverflow.com/questions/659051/check-if-a-temporary-table-exists-and-delete-if-it-exists-before-creating-a-temp
IF OBJECT_ID('tempdb..##Temp') IS NOT NULL DROP TABLE dbo.##Temp
-- Loop through SPROCs
-- Cursor: https://www.mssqltips.com/sqlservertip/1599/sql-server-cursor-example/
-- Substring: http://stackoverflow.com/questions/4662496/trim-left-characters-in-sql-server
DECLARE @item VARCHAR(MAX); -- SPROC Name
DECLARE db_cursor CURSOR FOR
SELECT Name FROM @Table WHERE 1=1
OPEN db_cursor
FETCH NEXT FROM db_cursor INTO @item
WHILE @@FETCH_STATUS = 0
BEGIN
-- Execute
-- Print to file using Temp Table: http://stackoverflow.com/questions/10568975/can-i-specify-an-input-sql-file-with-bcp
-- Script SPROC via XML: http://stackoverflow.com/a/3292693/5301903
-- ANSI_NULLS and QUOTED_IDENTIFIER retain current settings.
-- Prepare Temp Table
SELECT
'IF EXISTS(SELECT * FROM sys.procedures WHERE Name = '''+Object_name(object_id)+''')
DROP PROCEDURE [dbo].['+Object_name(object_id)+']
GO
SET ANSI_NULLS '+CASE WHEN CAST(ISNULL(OBJECTPROPERTYEX(object_id,N'ExecIsAnsiNullsOn'),0) AS bit) = 1 THEN 'ON' ELSE 'OFF' END+'
GO
SET QUOTED_IDENTIFIER '+CASE WHEN CAST(ISNULL(OBJECTPROPERTYEX(object_id,N'ExecIsQuotedIdentOn'),0) AS bit) = 1 THEN 'ON' ELSE 'OFF' END+'
GO
' + definition + '
GO' AS Text
INTO dbo.##Temp
FROM [sys].[sql_modules]
WHERE 1=1
--AND OBJECTPROPERTY (object_id,'IsProcedure')=1
--AND OBJECTPROPERTY (object_id,'IsTable')=1
--AND Object_name(object_id) LIKE @name
AND Object_name(object_id) = @item
-- Print to text https://social.msdn.microsoft.com/Forums/en-US/71aefd98-ee46-48fe-a129-60791c583555/output-results-to-text-file-using-tsql?forum=transactsql
DECLARE @CMD VARCHAR(1000) = 'bcp "SELECT * FROM ##Temp" queryout C:\temp\'[email protected]+'.sql -c -T -S '+ @@servername
EXECUTE Master.dbo.xp_CmdShell @Cmd
-- Clean up
DROP TABLE dbo.##Temp
-- End Execute
FETCH NEXT FROM db_cursor INTO @item
END
CLOSE db_cursor
DEALLOCATE db_cursor
thanks marc。其實我有一堆SSRS報告和一個實用程序來提取存儲的proc名稱。由於會有更多的這些報告頻繁進入,我正在考慮一個t-sql腳本,它可以獲取存儲過程的列表並生成一個腳本文件。那可能嗎? – stackoverflowuser 2010-07-20 17:24:02
謝謝。正是我在找什麼。 – stackoverflowuser 2010-07-20 17:33:51