繁体   English   中英

存储过程到.sql文件

[英]Stored Procedures to .sql files

在SQL 2005中是否有一个简单的过程将所有存储过程吐出到单独的.sql文件中。 我想将它们转移到VSS中,但是对于点击每个来获取源代码,将其转储到文本文件等等的前景并不太兴奋。

在SQL Management Studio中右键单击数据库,转到任务 - >生成脚本,演练向导。 其中一个页面将允许您将每个对象编写为自己的文件。

你可以运行这个选择:

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等...

如果要对整个数据库进行版本控制,Microsoft有一个SQL Server数据库发布向导(您可以在此处下载)。 概述说它与Visual Studio直接集成,但我没有亲自用它来保证它有多好(或坏)。

我编写了一个名为SMOscript的工具,它可以为每个数据库对象创建一个.sql文件。

它使用SQL Server的SMO库来生成CREATE和DROP脚本。

您还可以使用以下脚本在单独的.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

尝试使用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);
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM