t-sql хранимая процедура создания сценариев - PullRequest
14 голосов
/ 20 июля 2010

У меня есть куча имен хранимых процедур. Я хочу экспортировать скрипт создания для каждой хранимой процедуры. Каков наилучший способ сделать это?

Сейчас я вручную выбираю сохраненный процесс в SSMS и выбираю "Script stored procedure as -> Drop and Create to". Это кажется утомительным. Я надеюсь, что есть лучший способ справиться с этим. Спасибо.

Ответы [ 8 ]

22 голосов
/ 20 июля 2010

Вы можете щелкнуть правой кнопкой мыши базу данных в обозревателе объектов и выполнить задачу> Создать сценарии.

альтернативный текст http://i25.tinypic.com/2khmr8.png

Это позволяет выбирать целую группу объектов для сценариев (например, таблицы, представления, хранимые процедуры) и сохранять их в один большой файл SQL или один файл SQL на объект. Работает действительно неплохо!

Обновление: если вы хотите сделать это в приложении SQL Server Management Studio, вы можете использовать этот сценарий SQL для поиска сохраненных процедур и их определений - однако вы не можете выписать SQL Server Mgmt Studio файлы на диск, это не работает - но вы можете скопировать результаты, например, в 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
8 голосов
/ 20 июля 2010

Чтобы составить сценарий для всех, соответствующих определенным критериям, вы можете использовать что-то вроде ниже.

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('') 
2 голосов
/ 23 октября 2012

Нечто подобное поможет вам.

Используя динамические sql и курсоры, вы можете сгенерировать скрипт, каждый в отдельном файле с расширением .sql.

Этот скрипт будет генерировать скрипт для всех процедур, имена которых упоминаются в предложении IN:

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
2 голосов
/ 20 июля 2010

Если вы выберете Вид -> Сводка

Затем нажмите «Хранимые процедуры» в проводнике объектов, он предоставит вам список всех ваших хранимых процедур, которые вы можете выбрать Ctrl / Shift (выбрать несколько),Затем оттуда вы можете создать все сценарии удаления одновременно с созданием всех сценариев.Это одна из многих странностей, которые я обнаружил в SSMS.

Примечание. Еще одна полезная функция - это опция фильтра, позволяющая легко фильтровать хранимые / табличные процедуры.Просто щелкните правой кнопкой мыши в проводнике объектов, чтобы вызвать меню.

1 голос
/ 05 мая 2017

Следующее создаст сценарии для набора имен хранимых процедур. Сценарии будут сохранены в виде серии файлов .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: /473718/proverte-suschestvuet-li-vremennaya-tablitsa-i-udalite-ee-prezhde-chem-sozdavat-vremennuy-tablitsu
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\'+@item+'.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
1 голос
/ 21 июля 2010

Visual Studio 2008 Database Professional Edition и Visual Studio 2010 Professional (и выше) поддерживают специальные типы проектов для SQL Server 2005/2008. Эти проекты поддерживают автоматическое создание сценариев изменений, содержащих все изменения между текущим проектом и указанной целевой базой данных.

AFAIK RedGate также предоставляет некоторые подобные инструменты, хотя у меня нет с ними опыта.

1 голос
/ 20 июля 2010

Вы можете посмотреть в sp_helptext некоторые идеи о том, как использовать это для создания своих сценариев.

0 голосов
/ 01 февраля 2013
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 с датой создания / изменения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...