2008-10-03 12 views
10

Gibt es eine Möglichkeit, gespeicherte Prozeduren von einer SQL Server 2005 Express-Datenbank mit C# zu erhalten? Ich möchte alle diese Daten auf die gleiche Weise exportieren, wie Sie es mit SQL Server Management Studio skripten können, ohne die GUI zu installieren.Einfache Möglichkeit, programmgesteuert alle gespeicherten Prozeduren abzurufen

Ich habe einige Referenzen über die PowerShell gesehen, aber am Ende ist eine C# -Konsolen-App das, was ich wirklich will.

Um zu klären ....

Ich möchte die gespeicherten Prozeduren Skript aus. Die Liste über die Select * from sys.procedures ist hilfreich, aber am Ende muss ich jedes von diesen Skripten erstellen.

Antwort

7

einfach die Ausgabe von SELECT Namen von SYS.PROCEDURES lesen, dann rufen Sie EXEC sp_helptext Servicepunktnamen für jede gespeicherte Prozedur, werden Sie einen Datensatz mit einer Textzeile pro Zeile gesetzt bekommen.

2

This blog post schlägt läuft dies gegen Ihre Datenbank:

select * from sys.procedures 
0

Sie C# -Code schreiben können Sie die folgende Abfrage auf der Datenbank ausgeführt werden.

Select * from sys.procedures 
0

Ich denke, das ist das, was Sie wirklich suchen:

select SPECIFIC_NAME,ROUTINE_DEFINITION from information_schema.routines 

dort auch eine Tonne andere nützliche Spalten Es gibt ...

+0

ROUTINE_DEFINITION in fertig INFORMATION_SCHEMA (in SQL 2005) ist leider für lange SPs abgeschnitten. Ich werde meinen Code dafür aufspüren und in einer anderen Antwort posten. –

19

Sie SMO dafür verwenden können. Zunächst einmal, fügen Verweise auf diese Baugruppen zu einem Projekt:

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

Sie befinden sich in den GAC (wechseln Sie zum Ordner C: \ WINDOWS \ assembly).

Verwenden Sie den folgenden Code als Beispiel für scripting Stored Procedures:

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()); 
    } 
} 

Siehe auch: SQL Server: SMO Scripting Basics.

+0

finden möglicherweise auch erforderliche Verweise in C: \ Programme \ Microsoft SQL Server \ 100 \ SDK \ Assemblies – user423430

+1

Ich musste auch auf Microsoft.SqlServer.Management.Sdk.Sfc verweisen – user423430

+1

Ab Sql Server 2008R2 die [URN-Klasse] (http://msdn.microsoft.com/en-us/library/microsoft.sqlserver.management.sdk.sfc.urn(v=sql.105).aspx) wurde in den Namespace Microsoft.SqlServer.Management.Sdk.Sfc verschoben in Assembly Microsoft.SqlServer.Management.Sdk.Sfc. –

2
;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 
2

können Sie verwenden:

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

Sie können auch alle möglichen anderen Schema Informationen wie Tabellen, Indizes usw. erhalten, wenn Sie sie benötigen.

Sie können Informationen über GetSchema get() here und Informationen über die SQL Server-Schema-Sammlungen here

Edit: Sorry, das hilft nicht mit tatsächlich die Informationen scripting, aber ich denke, es nützliche Informationen zu haben ist.

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 
0

Wenn Sie eine Dose Reflektor auf SqlMetal.exe öffnen (einen eigenständigen Teil von LINQ-to-SQL, den Code aus einer Datenbank erzeugt), können Sie die SQL-Anweisungen finden Sie benutzen eine bekommen Liste aller gespeicherten Prozeduren und Funktionen. Das SQL ist ähnlich, aber nicht identisch mit the one in this answer.

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 
    } 
-1

Angenommen, Sie haben SqlConnection Objekt namens SQLCON, einfachste Weg ist sqlCon.GetSchema zu nennen ("Verfahren")

0

Dies ist eine SQL, die ich gerade getestet und verwendet in MSSQL

SELECT NAME from SYS.PROCEDURES 
order by name 

Wenn Sie für einen bestimmten Namen oder Teilzeichenfolge/Text

SELECT NAME from SYS.PROCEDURES 
where name like '%<TEXT_TO_LOOK_FOR>%' 
order by name 
suchen müssen

mit genau ersetzen, zum Beispiel:

SELECT NAME from SYS.PROCEDURES 
where name like '%CUSTOMER%' 
order by name 

Und

EXEC sp_HelpText SPNAME 

für jede gespeicherte Prozedur aufrufen, werden Sie eine Aufzeichnung mit einer Zeile Text pro Zeile

Verwandte Themen