2008-10-03 8 views
10

Có cách nào để lấy các thủ tục được lưu trữ từ cơ sở dữ liệu SQL Server 2005 Express bằng C# không? Tôi muốn xuất tất cả các dữ liệu này theo cùng một cách mà bạn có thể viết nó bằng cách sử dụng SQL Server Management Studio, mà không cần phải cài đặt GUI.Cách đơn giản để lập trình có được tất cả các thủ tục được lưu trữ

Tôi đã thấy một số tham chiếu để thực hiện điều đó thông qua PowerShell nhưng cuối cùng, ứng dụng giao diện điều khiển C# là những gì tôi thực sự muốn.

Để làm rõ ....

Tôi muốn kịch bản hành các thủ tục lưu trữ. Danh sách thông qua Select * from sys.procedures là hữu ích, nhưng cuối cùng tôi cần phải viết kịch bản ra từng cái này.

Trả lời

7

Chỉ cần đọc đầu ra của SELECT NAME khỏi SYS.PROCEDURES, sau đó gọi EXEC sp_helptext SPNAME cho mỗi thủ tục lưu trữ, bạn sẽ nhận được một kỷ lục thiết lập với một dòng văn bản cho mỗi hàng.

2

This blog post đề nghị chạy này chống lại cơ sở dữ liệu của bạn:

select * from sys.procedures 
0

Bạn có thể viết mã C# để chạy các truy vấn sau đây trên cơ sở dữ liệu của bạn.

Select * from sys.procedures 
0

Tôi nghĩ rằng đây là những gì bạn đang thực sự tìm kiếm

select SPECIFIC_NAME,ROUTINE_DEFINITION from information_schema.routines 

Có một tấn của các cột hữu ích khác trong đó quá ...

+0

ROUTINE_DEFINITION trong THÔNG TIN_SCHEMA (trong SQL 2005) không may là cắt ngắn cho SP dài. Tôi sẽ theo dõi mã của tôi cho điều này và đăng nó trong câu trả lời khác. –

19

Bạn có thể sử dụng SMO cho điều đó. Trước hết, thêm tham chiếu đến các hội đồng để dự án của bạn:

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

Chúng nằm trong GAC (duyệt đến thư mục C: \ WINDOWS \ assembly).

Sử dụng đoạn mã sau như một ví dụ về thủ tục kịch bản lưu trữ:

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

Xem thêm: SQL Server: SMO Scripting Basics.

+0

cũng có thể tìm thấy các tham chiếu bắt buộc trong C: \ Program Files \ Microsoft SQL Server \ 100 \ SDK \ Assemblies – user423430

+1

Tôi cũng phải tham khảo Microsoft.SqlServer.Management.Sdk.Sfc – user423430

+1

Kể từ Sql Server 2008R2, [URN class] (http://msdn.microsoft.com/en-us/library/microsoft.sqlserver.management.sdk.sfc.urn(v=sql.105).aspx) đã chuyển sang không gian tên Microsoft.SqlServer.Management.Sdk.Sfc trong 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

Bạn có thể sử dụng:

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

Bạn cũng có thể nhận được tất cả các loại thông tin schema khác như bảng biểu, chỉ số vv nếu bạn cần chúng.

Bạn có thể nhận được thông tin trên GetSchema() here và thông tin trên SQL Server Schema Collections here

Edit: Xin lỗi, điều này không giúp với thực kịch bản các thông tin, nhưng tôi đoán nó là thông tin hữu ích để có.

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

Nếu bạn mở một lon phản xạ trên sqlmetal.exe (một phần độc lập của LINQ-to-SQL mà tạo ra mã từ một cơ sở dữ liệu), bạn sẽ nhìn thấy câu lệnh SQL nó sử dụng để có được một danh sách tất cả các thủ tục và chức năng được lưu trữ. SQL tương tự, nhưng không giống nhau, đến 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

Giả sử bạn có SqlConnection đối tượng gọi sqlCon, cách đơn giản nhất là gọi sqlCon.GetSchema ("Thủ tục")

0

Đây là một SQL mà tôi đã thử nghiệm và sử dụng trong MSSQL

SELECT NAME from SYS.PROCEDURES 
order by name 

Trong trường hợp bạn cần tìm tên hoặc chuỗi/văn bản cụ thể

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

Replace with chính xác điều đó ví dụ:

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

Và gọi

EXEC sp_HelpText SPNAME 

cho mỗi thủ tục lưu trữ, bạn sẽ nhận được một kỷ lục thiết lập với một dòng văn bản cho mỗi hàng