2008-10-03 12 views
10

क्या सी # सर्वर का उपयोग कर SQL सर्वर 2005 एक्सप्रेस डेटाबेस से संग्रहित प्रक्रियाएं प्राप्त करने का कोई तरीका है? मैं इस डेटा को उसी तरीके से निर्यात करना चाहता हूं कि आप इसे जीयूआई स्थापित किए बिना SQL सर्वर प्रबंधन स्टूडियो का उपयोग करके स्क्रिप्ट कर सकते हैं।सभी संग्रहित प्रक्रियाओं को प्रोग्रामेटिक रूप से प्राप्त करने का सरल तरीका

मैंने पावरशेल के माध्यम से कुछ करने के लिए कुछ संदर्भ देखे हैं लेकिन अंत में एक सी # कंसोल ऐप मैं वास्तव में चाहता हूं।

स्पष्ट करने के लिए ....

मैं बाहर संग्रहित प्रक्रियाओं स्क्रिप्ट करना चाहते हैं। Select * from sys.procedures के माध्यम से सूची उपयोगी है, लेकिन अंत में मुझे इनमें से प्रत्येक को स्क्रिप्ट करने की आवश्यकता है।

उत्तर

7

बस SYS.PROCEDURES से चयन नाम के उत्पादन में पढ़ते हैं, तो प्रत्येक संग्रहीत प्रक्रिया के लिए EXEC sp_HelpText SPNAME कहते हैं, आप एक रिकार्ड प्रति पंक्ति पाठ की एक पंक्ति के साथ सेट कर देंगे।

2

This blog post अपने डेटाबेस के खिलाफ इस चल पता चलता है:

select * from sys.procedures 
0

आप अपने डेटाबेस पर निम्न क्वेरी को चलाने के लिए सी # कोड लिख सकते हैं।

Select * from sys.procedures 
0

मुझे लगता है कि यह है कि क्या तुम सच में की तलाश कर रहे है:

select SPECIFIC_NAME,ROUTINE_DEFINITION from information_schema.routines 

वहाँ वहाँ भी में अन्य उपयोगी स्तंभों की एक टन कर रहे हैं ...

+0

ROUTINE_DEFINITION प्रति पाठ की एक पंक्ति के साथ सेट एक रिकार्ड प्राप्त करेंगे INFORMATION_SCHEMA (SQL 2005 में) दुर्भाग्य से लंबे एसपी के लिए छोटा कर दिया गया है। मैं इसके लिए अपना कोड ट्रैक करूँगा और इसे किसी अन्य उत्तर में पोस्ट करूंगा। –

19

आप उस के लिए एसएमओ उपयोग कर सकते हैं। सबसे पहले, अपनी परियोजना के लिए इन विधानसभाओं के संदर्भ जोड़:

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

वे में स्थित हैं जीएसी (सी: \ विन्डोज़ \ असेंबली फ़ोल्डर ब्राउज़ करें)।

पटकथा संग्रहित प्रक्रियाओं का एक उदाहरण के रूप में निम्न कोड का उपयोग करें:

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 Scripting Basics

+0

सी: \ प्रोग्राम फ़ाइलें \ माइक्रोसॉफ्ट एसक्यूएल सर्वर \ 100 \ एसडीके \ असेंबली – user423430

+1

में आवश्यक संदर्भ भी मिल सकता है मुझे माइक्रोसॉफ्ट का संदर्भ देना पड़ा। SQL सर्वर। प्रबंधन। डीडीसी – user423430

+1

एसक्यूएल सर्वर 2008R2 के रूप में, [यूआरएन कक्षा] (http://msdn.microsoft.com/en-us/library/microsoft.sqlserver.management.sdk.sfc.urn(v=sql.105).aspx) माइक्रोसॉफ्ट.SqlServer.Management.Sdk.Sfc नामस्थान में स्थानांतरित हो गया है असेंबली में 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

आप उपयोग कर सकते हैं:

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

तुम भी तालिकाओं की तरह अन्य स्कीमा जानकारी के सभी प्रकार प्राप्त कर सकते हैं, अनुक्रमित आदि यदि आप उन्हें जरूरत है।

आप पर एसक्यूएल सर्वर स्कीमा संग्रह GetSchema() here पर जानकारी और जानकारी प्राप्त कर सकते here

संपादित करें: क्षमा करें, यह वास्तव में जानकारी को स्क्रिप्ट के साथ मदद नहीं करता है, लेकिन मुझे लगता है कि यह है के लिए उपयोगी जानकारी है।

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

यदि आप sqlmetal.exe पर परावर्तक का एक कर सकते हैं (LINQ करने वाली एसक्यूएल का एक स्टैंड-अलोन बात यह है कि किसी डेटाबेस से कोड उत्पन्न करता है), तो आप SQL कथन यह एक पाने के लिए उपयोग करता है देख सकते हैं खुल सभी संग्रहीत प्रक्रियाओं और कार्यों की सूची। एसक्यूएल समान है, लेकिन समान नहीं है, 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

मान लिया जाये कि आप SqlConnection वस्तु sqlCon कहा जाता है, सबसे आसान तरीका sqlCon.GetSchema ("प्रक्रिया")

0

यह एक एसक्यूएल कि मैं सिर्फ परीक्षण किया और MSSQL में

का इस्तेमाल किया है है कॉल करने के लिए है
SELECT NAME from SYS.PROCEDURES 
order by name 

मामले में है कि आप एक विशिष्ट नाम या सबस्ट्रिंग/पाठ के लिए देखने की जरूरत है

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

वास्तव में है कि उदाहरण के लिए बदलें:

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

और

EXEC sp_HelpText SPNAME 
प्रत्येक संग्रहीत प्रक्रिया के लिए

बुला, आप में पंक्ति

संबंधित मुद्दे