12

C# を使用して SQL Server 2005 Express データベースからストアド プロシージャを取得する方法はありますか? GUI をインストールしなくても、SQL Server Management Studio を使用してスクリプトを作成できるのと同じ方法で、このすべてのデータをエクスポートしたいと考えています。

PowerShell を介して何かを行うための参照を見てきましたが、最終的には C# コンソール アプリが本当に必要なものです。

明確にするために....

ストアド プロシージャのスクリプトを作成したいと思います。のリストSelect * from sys.proceduresは役に立ちますが、最終的にはこれらをそれぞれスクリプト化する必要があります。

4

12 に答える 12

22

そのためにSMOを使用できます。まず、これらのアセンブリへの参照をプロジェクトに追加します。

  • Microsoft.SqlServer.ConnectionInfo
  • Microsoft.SqlServer.Smo
  • Microsoft.SqlServer.SmoEnum

それらはGACにあります(C:\ WINDOWS \ assemblyフォルダーに移動します)。

ストアドプロシージャのスクリプトの例として、次のコードを使用します。

using System;
using System.Collections.Generic;
using System.Data;
using Microsoft.SqlServer.Management.Smo;

class Program
{
   static void Main(string[] args)
   {
      Server server = new Server(@".\SQLEXPRESS");
      Database db = server.Databases["Northwind"];
      List<SqlSmoObject> list = new List<SqlSmoObject>();
      DataTable dataTable = db.EnumObjects(DatabaseObjectTypes.StoredProcedure);
      foreach (DataRow row in dataTable.Rows)
      {
         string sSchema = (string)row["Schema"];
         if (sSchema == "sys" || sSchema == "INFORMATION_SCHEMA")
            continue;
         StoredProcedure sp = (StoredProcedure)server.GetSmoObject(
            new Urn((string)row["Urn"]));
         if (!sp.IsSystemObject)
            list.Add(sp);
      }
      Scripter scripter = new Scripter();
      scripter.Server = server;
      scripter.Options.IncludeHeaders = true;
      scripter.Options.SchemaQualify = true;
      scripter.Options.ToFileOnly = true;
      scripter.Options.FileName = @"C:\StoredProcedures.sql";
      scripter.Script(list.ToArray());
   }
}

参照:SQL Server:SMOスクリプティングの基本

于 2008-10-04T00:56:38.820 に答える
6

SYS.PROCEDURES から SELECT NAME の出力を読み取り、ストアド プロシージャごとに EXEC sp_HelpText SPNAME を呼び出すだけで、行ごとに 1 行のテキストを含むレコード セットが得られます。

于 2008-10-03T23:46:59.930 に答える
3
;WITH ROUTINES AS (
    -- CANNOT use INFORMATION_SCHEMA.ROUTINES because of 4000 character limit
    SELECT o.type_desc AS ROUTINE_TYPE
            ,o.[name] AS ROUTINE_NAME
            ,m.definition AS ROUTINE_DEFINITION
    FROM sys.sql_modules AS m
    INNER JOIN sys.objects AS o
        ON m.object_id = o.object_id
)
SELECT *
FROM ROUTINES
于 2008-10-06T15:01:50.440 に答える
2

このブログ投稿では、データベースに対してこれを実行することを提案しています。

select * from sys.procedures
于 2008-10-03T23:42:32.357 に答える
2
public static void GenerateTableScript()
    {
        Server databaseServer = default(Server);//DataBase Server Name
        databaseServer = new Server("yourDatabase Server Name");
        string strFileName = @"C:\Images\Your FileName_" + DateTime.Today.ToString("yyyyMMdd") + ".sql"; //20120720`enter code here
        if (System.IO.File.Exists(strFileName))
            System.IO.File.Delete(strFileName);
        List<SqlSmoObject> list = new List<SqlSmoObject>();
        Scripter scripter = new Scripter(databaseServer);
        Database dbUltimateSurvey = databaseServer.Databases["YourDataBaseName"];//DataBase Name
        //Table scripting Writing
        DataTable dataTable1 = dbUltimateSurvey.EnumObjects(DatabaseObjectTypes.Table);
        foreach (DataRow drTable in dataTable1.Rows)
        {
            //string strTableSchema = (string)drTable["Schema"];
            //if (strTableSchema == "dbo")
            //    continue;
            Table dbTable = (Table)databaseServer.GetSmoObject(new Urn((string)drTable["Urn"]));
            if (!dbTable.IsSystemObject)
                if (dbTable.Name.Contains("SASTool_"))
                    list.Add(dbTable);
        }
        scripter.Server = databaseServer;
        scripter.Options.IncludeHeaders = true;
        scripter.Options.SchemaQualify = true;
        scripter.Options.ToFileOnly = true;
        scripter.Options.FileName = strFileName;
        scripter.Options.DriAll = true;
        scripter.Options.AppendToFile = true;
        scripter.Script(list.ToArray());//Table Script completed
        //Store Procedures scripting Writing
        list = new List<SqlSmoObject>();
        DataTable dataTable = dbUltimateSurvey.EnumObjects(DatabaseObjectTypes.StoredProcedure);
        foreach (DataRow row in dataTable.Rows)
        {
            string sSchema = (string)row["Schema"];
            if (sSchema == "sys" || sSchema == "INFORMATION_SCHEMA")
                continue;
            StoredProcedure sp = (StoredProcedure)databaseServer.GetSmoObject(
               new Urn((string)row["Urn"]));
            if (!sp.IsSystemObject)
                if (sp.Name.Contains("custom_"))
                    list.Add(sp);
        }
        scripter.Server = databaseServer;
        scripter.Options.IncludeHeaders = true;
        scripter.Options.SchemaQualify = true;
        scripter.Options.ToFileOnly = true;
        scripter.Options.FileName = strFileName;
        scripter.Options.DriAll = true;
        scripter.Options.AppendToFile = true;
        scripter.Script(list.ToArray());   // Stored procedure Script completed
    }
于 2012-07-26T16:11:25.497 に答える
2

以下を使用できます。

DataTable  dtProcs = sqlConn.GetSchema("Procedures", new string[] { databaseName });
DataTable  dtProcParams = sqlConn.GetSchema("ProcedureParameters", new string[] { databaseName });

必要に応じて、テーブル、インデックスなど、あらゆる種類の他のスキーマ情報を取得することもできます。

GetSchema() に関する情報はこちらで、SQL Server スキーマ コレクションに関する情報はこちらで取得できます。

編集:申し訳ありませんが、これは実際に情報をスクリプト化するのには役立ちませんが、役立つ情報だと思います.

于 2008-10-08T15:31:15.637 に答える
0
begin
--select column_name from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME='Products' 
--Declare the Table variable 
DECLARE @GeneratedStoredProcedures TABLE
(
        Number INT IDENTITY(1,1), --Auto incrementing Identity column
        name VARCHAR(300) --The string value
)

--Decalre a variable to remember the position of the current delimiter
DECLARE @CurrentDelimiterPositionVar INT 
declare @sqlCode varchar(max)
--Decalre a variable to remember the number of rows in the table
DECLARE @Count INT

--Populate the TABLE variable using some logic
INSERT INTO @GeneratedStoredProcedures SELECT name FROM sys.procedures where name like 'procGen_%'

--Initialize the looper variable
SET @CurrentDelimiterPositionVar = 1

--Determine the number of rows in the Table
SELECT @Count=max(Number) from @GeneratedStoredProcedures

--A variable to hold the currently selected value from the table
DECLARE @CurrentValue varchar(300);

--Loop through until all row processing is done
WHILE @CurrentDelimiterPositionVar <= @Count
BEGIN
    --Load current value from the Table
    SELECT @CurrentValue = name FROM @GeneratedStoredProcedures WHERE Number = @CurrentDelimiterPositionVar 
    --Process the current value
    --print @CurrentValue
    set @sqlCode = 'drop procedure ' + @CurrentValue
    print @sqlCode
    --exec (@sqlCode)


    --Increment loop counter
    SET @CurrentDelimiterPositionVar = @CurrentDelimiterPositionVar + 1;
END

end
于 2009-06-18T10:25:40.767 に答える
0

sqlmetal.exe (データベースからコードを生成する LINQ-to-SQL のスタンドアロン部分) でリフレクターの缶を開くと、すべてのストアド プロシージャと関数のリストを取得するために使用する SQL ステートメントを確認できます。 . SQL は、この回答のも​​のと似ていますが、同一ではありません。

于 2009-11-05T16:52:39.747 に答える
0

C# コードを記述して、データベースで次のクエリを実行できます。

Select * from sys.procedures
于 2008-10-03T23:43:49.890 に答える
0

これがあなたが本当に探しているものだと思います:

select SPECIFIC_NAME,ROUTINE_DEFINITION from information_schema.routines

そこには他にもたくさんの便利な列があります...

于 2008-10-04T00:18:14.983 に答える
-1

sqlConSqlConnectionというオブジェクトがあると仮定すると、最も簡単な方法は sqlCon.GetSchema("Procedures") を呼び出すことです

于 2015-03-02T12:48:39.033 に答える