【问题标题】:Stored Procedures to .sql files存储过程到 .sql 文件
【发布时间】:2008-12-03 15:51:18
【问题描述】:

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

【问题讨论】:

    标签: sql sql-server sql-server-2005 stored-procedures


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      你可以运行这个选择:

      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】:

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            【解决方案6】:

            您还可以使用以下脚本在单独的 .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 在循环的末尾吗?
            猜你喜欢
            • 2011-03-06
            • 1970-01-01
            • 2014-12-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-07-12
            • 2019-01-17
            • 1970-01-01
            相关资源
            最近更新 更多