【发布时间】:2008-12-03 15:51:18
【问题描述】:
在 SQL 2005 中是否有一个简单的过程可以将我的所有存储过程吐出到单独的 .sql 文件中。我想将它们移到 VSS 中,但对于单击每个以获取源、将其转储到文本文件等的前景并不太兴奋。..
【问题讨论】:
标签: sql sql-server sql-server-2005 stored-procedures
在 SQL 2005 中是否有一个简单的过程可以将我的所有存储过程吐出到单独的 .sql 文件中。我想将它们移到 VSS 中,但对于单击每个以获取源、将其转储到文本文件等的前景并不太兴奋。..
【问题讨论】:
标签: sql sql-server sql-server-2005 stored-procedures
在 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 数据库发布向导(您可以下载它here)。概述说与 Visual Studio 直接集成,但我没有亲自使用它来保证它可能好(或坏)。
【讨论】:
我编写了一个名为 SMOscript 的工具,它可以选择为每个数据库对象创建一个 .sql 文件。
它使用 SQL Server 的 SMO 库来生成 CREATE 和 DROP 脚本。
【讨论】:
尝试使用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);
}
}
}
【讨论】:
您还可以使用以下脚本在单独的 .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
【讨论】:
FETCH NEXT FROM script INTO @name, @Definition 在循环的末尾吗?