2008-10-03 10 views
10

¿Hay alguna manera de obtener procedimientos almacenados de una base de datos SQL Server 2005 Express utilizando C#? Me gustaría exportar todos estos datos de la misma manera que puede guiarlo usando SQL Server Management Studio, sin tener que instalar la GUI.Manera simple de obtener todos los procedimientos almacenados mediante programación

He visto algunas referencias para hacer cosas a través de PowerShell, pero al final una aplicación de consola C# es lo que realmente quiero.

Para aclarar ....

me gustaría guión a cabo los procedimientos almacenados. La lista a través del Select * from sys.procedures es útil, pero al final necesito guiones de cada uno de estos.

Respuesta

7

Basta con leer la salida del SELECT NAME de SYS.PROCEDURES, a continuación, llamar EXEC sp_helptext SPName para cada procedimiento almacenado, que obtendrá un conjunto de registros con una línea de texto en cada fila.

2

This blog post sugiere la ejecución de este en contra de su base de datos:

select * from sys.procedures 
0

puede escribir código C# para ejecutar la consulta siguiente en la base de datos.

Select * from sys.procedures 
0

creo que esto es lo que realmente estás buscando:

select SPECIFIC_NAME,ROUTINE_DEFINITION from information_schema.routines 

Hay un montón de otras columnas útiles en allí también ...

+0

ROUTINE_DEFINITION en INFORMATION_SCHEMA (en SQL 2005) desafortunadamente está truncado para SP largos. Seguiré mi código para esto y lo publicaré en otra respuesta. –

19

Usted puede utilizar SMO para eso. En primer lugar, añadir referencias a estas asambleas para su proyecto:

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

Están ubicados en el GAC (busque la carpeta C: \ WINDOWS \ assembly).

utilizar el siguiente código como un ejemplo de los procedimientos de script almacenado:

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

Consulte también: SQL Server: SMO Scripting Basics.

+0

también puede encontrar referencias requeridas en C: \ Archivos de programa \ Microsoft SQL Server \ 100 \ SDK \ Assemblies – user423430

+1

También tuve que hacer referencia a Microsoft.SqlServer.Management.Sdk.Sfc – user423430

+1

A partir del servidor Sql 2008R2, la [clase URN] (http://msdn.microsoft.com/en-us/library/microsoft.sqlserver.management.sdk.sfc.urn(v=sql.105).aspx) se ha movido al espacio de nombres Microsoft.SqlServer.Management.Sdk.Sfc en el ensamblado 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

Se puede utilizar:

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

También puede obtener todo tipo de información de otro esquema como tablas, índices, etc., si los necesita.

Usted puede obtener información sobre GetSchema() here y la información en el servidor de colecciones de esquemas SQL here

Edit: Lo siento, esto no ayuda con la realidad de secuencias de comandos de la información, pero supongo que es información útil a tener.

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

Si abre una lata de reflector en SqlMetal.exe (una parte independiente de LINQ a SQL que genera el código de una base de datos), se puede ver las sentencias SQL que utiliza para obtener una lista de todos los procedimientos y funciones almacenados. El SQL es similar, pero no idéntico, al 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

Asumiendo que tiene SqlConnection objeto llamado sqlCon, forma más sencilla es llamar sqlCon.GetSchema ("Procedimientos")

0

Este es un SQL que acabo de probado y utilizado en MSSQL

SELECT NAME from SYS.PROCEDURES 
order by name 

En caso de que usted necesita buscar un nombre específico o subcadena/texto

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

Reemplazar con exactamente eso, por ejemplo:

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

Y llamando

EXEC sp_HelpText SPNAME 

para cada procedimiento almacenado, que obtendrá un conjunto de registros con una línea de texto en cada fila

Cuestiones relacionadas