Хранимые процедуры в .sql файлах - PullRequest
6 голосов
/ 03 декабря 2008

Существует ли в SQL 2005 простой процесс для выделения всех моих хранимых процедур в отдельные файлы .sql. Я бы хотел перенести их в VSS, но меня не очень радует перспектива щелкнуть по каждому из них, чтобы получить исходный код, поместить его в текстовый файл и т. Д.

Ответы [ 6 ]

14 голосов
/ 03 декабря 2008

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

6 голосов
/ 03 декабря 2008

Вы можете запустить этот выбор:

select
    O.name, M.definition
from
    sys.objects as O
left join
    sys.sql_modules as M
    on O.object_id = M.object_id
where
    type = 'P'

и вы получите имя и исходный код для хранимых процедур. Вероятно, самый простой способ, как поместить его в файлы, - это "классический" язык, такой как c #, java и т.д ...

3 голосов
/ 03 декабря 2008

Если вы хотите создать версию всей своей базы данных, у Microsoft есть мастер публикации баз данных SQL Server (вы можете скачать его здесь ). В обзоре говорится, что есть прямая интеграция с Visual Studio, но я не использовал ее лично, чтобы подтвердить, насколько она хороша (или плоха).

2 голосов
/ 05 декабря 2008

Я написал инструмент под названием SMOscript , в котором есть возможность создать один файл .sql для каждого объекта базы данных.

Он использует библиотеку SMO SQL Server для генерации скриптов CREATE и DROP.

1 голос
/ 22 октября 2012

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

Используя динамический запрос и курсор, вы можете сделать это так:

DECLARE @name varchar(100)
DECLARE @Definition varchar(max)
DECLARE @sql varchar(300)
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'
OPEN script
FETCH NEXT FROM script INTO @name, @Definition
WHILE @@FETCH_STATUS = 0 
BEGIN
  FETCH NEXT FROM script INTO @name, @Definition
  INSERT INTO TEMPTABLE VALUES(@definition)
  SET @Sql = ('BCP "SELECT TOP 1 def FROM TEMPTABLE ORDER BY ID DESC" queryout "C:\' + @name + '.sql" -c -T')
  EXEC XP_CmdShell @Sql
END 
CLOSE script
DEALLOCATE script
DROP TABLE TEMPTABLE
1 голос
/ 22 ноября 2011

Попробуйте использовать Sql Server SMO . Пример включен ниже:

//C:\Program Files\Microsoft SQL Server\{version}\SDK\Assemblies\
using Microsoft.SqlServer;
using Microsoft.SqlServer.Server;
using Microsoft.SqlServer.Management.Smo;
using Microsoft.SqlServer.Management.Common;
using System.Data.SqlClient;

string sqlConnectionString="";
string databaseName="";

var Connection = new SqlConnection(sqlConnectionString);
Connection.Open();
int counter = 0;
var db= new Server(new ServerConnection(Connection)).Databases[databaseName];

foreach (var item in db.StoredProcedures.OfType<StoredProcedure>())
{
    if (item.IsSystemObject ==  false)
    {
        using (TextWriter writer = new StreamWriter(item.Name+".sql", false))
        {
            writer.WriteLine(item.TextHeader + item.TextBody);
        }
    }
}
...