একটি বৃহত এসকিউএল স্ক্রিপ্ট কার্যকর করুন (জিও কমান্ড সহ)


89

আমার একটি সি # প্রোগ্রামের মধ্যে থেকে এসকিউএল স্টেটমেন্টের একটি বিশাল সেট (টেবিল, ভিউ এবং সঞ্চিত পদ্ধতিগুলির গুচ্ছ তৈরি) চালানো দরকার।

এই বিবৃতিগুলি বিবৃতি দ্বারা পৃথক করা প্রয়োজন GO, তবে বিবৃতি SqlCommand.ExecuteNonQuery()পছন্দ করে না GO। আমার সমাধান, যা আমি মনে করি আমি রেফারেন্সের জন্য পোস্ট করব, তা এসকিউএল স্ট্রিংটি চালু করা ছিলGO লাইনগুলিতে এবং প্রতিটি ব্যাচকে আলাদাভাবে চালানো।

কোন সহজ / উন্নত উপায় আছে?

উত্তর:


108

এসকিউএল সার্ভার ম্যানেজমেন্ট অবজেক্টস (এসএমও) ব্যবহার করুন যা জিও বিভাজনকারী বোঝে। আমার ব্লগ পোস্টটি এখানে দেখুন: http://weblogs.asp.net/ ਜঞ্জলয়ে / হ্যান্ডলিং - _2200_GO_2200_ - Separators - in - SQL - Scriptts- 2D00 সহজ উপায়

কোডের উদাহরণ:

public static void Main()    
{        
  string scriptDirectory = "c:\\temp\\sqltest\\";
  string sqlConnectionString = "Integrated Security=SSPI;" +
  "Persist Security Info=True;Initial Catalog=Northwind;Data Source=(local)";
  DirectoryInfo di = new DirectoryInfo(scriptDirectory);
  FileInfo[] rgFiles = di.GetFiles("*.sql");
  foreach (FileInfo fi in rgFiles)
  {
        FileInfo fileInfo = new FileInfo(fi.FullName);
        string script = fileInfo.OpenText().ReadToEnd();
        using (SqlConnection connection = new SqlConnection(sqlConnectionString))
        {
            Server server = new Server(new ServerConnection(connection));
            server.ConnectionContext.ExecuteNonQuery(script);
        }
   }
}

যদি এটি আপনার পক্ষে কাজ করে না, ফিল হ্যাকের লাইব্রেরিটি দেখুন যা এটি পরিচালনা করে: http://haacked.com/archive/2007/11/04/a-library-for-executes-sql-scriptts-with-go-separators -আর.এএসপিএক্স


4
কীভাবে এটি কোনও লেনদেনের সাথে সংহত করা যায়? কোডটি SQLLonnication এর সাথে সার্ভার সংযোগ তৈরি করার সময় একটি অবৈধপ্রকাশের অনুভূতি ছুঁড়ে দেয় যাতে এটির লেনদেনের মুলতুবি রয়েছে।
বেন পিয়ার্স

4
এই সমাধানটি কাজ করে, আমি কেবল এটি যুক্ত করতে চাই আপনি যদি কোনও বস্তুর সাথে লেনদেনগুলি ব্যবহার করতে চান তবে TransactionScopeআপনাকে কেবলমাত্র বর্তমান পরিবেশনার লেনদেনের সাথে সংযোগটি তালিকাভুক্ত করতে হবে। : এখানে আমার উত্তর চেক করুন stackoverflow.com/a/18322938/1268570
Jupaol

দুর্দান্ত কাজ করে তবে আমরা ব্যবহার করতে পারি SqlConnection.InfoMessage) সি # অ্যাপ্লিকেশনটিতে ফলাফল দেখতে বাtxt ফাইলটিতে ফলাফল সংরক্ষণ করতে , স্ক্রিপ্টটি সফলভাবে সম্পাদিত হয়েছে কিনা তা জানতে, কারণ sqlcmdআমি সম্প্রতি 55 মিনিটের পরে দূরবর্তী হোস্টে 150 এমবি স্ক্রিপ্ট ফাইলটি কার্যকর করেছি যখন ব্যবহার করেছি এই ত্রুটিটি দিয়ে সারিগুলি প্রভাবিত হয়েছিল TCP Provider: An existing connection was forcibly closed by the remote host.,, communication link failure। , প্রভাবিত সারিগুলির কোনওটি জানা যায় না, তবে ডেটাবেস উত্পন্ন স্ক্রিপ্ট ফাইল চলাকালীন আমি ত্রুটি বার্তাগুলি সম্পর্কে উদ্বিগ্ন।
শাইজু টি

4
যখন এসকিউএল ডেলগুলির কিছু মেশিনে ইনস্টল করা না হয় তখন এই সমাধানগুলি আপনার কোডটিকে ব্যর্থ করে তোলে। .NET উইন্ডোজে কিছু dll এর বিল্ট ব্যবহার করে। কিছু এসকিউএল বৈশিষ্ট্য প্যাকের অনুপস্থিতি (ম্যানেজমেন্ট অবজেক্টস সহ) কোনও ত্রুটি 'মাইক্রোসফ্ট.সকিউল সার্ভার.সক্লিলক্রিপ্রোভাইডার.ডিএল'র মতো খুঁজে পাওয়া যায়নি prevent এটিকে ঠিক করা (এটি সহজ কাজ নয়) পরবর্তী ত্রুটিটি হ'ল মাইক্রোসফ্ট.এসএলএল সার্ভার.বাথ পার্সার.ডিল 'ইত্যাদি আপনার অ্যাপ্লিকেশনটির নমনীয়তা নিশ্চিত করার জন্য অন্যান্য সমাধান সন্ধান করবে।
আলেকজান্ডার সারগসায়ান

এটি কার্যকর হয় না, বিশেষত যদি সেখানে কোনও পরিবর্তনের প্রক্রিয়া বিবৃতি থাকে। এটি কেবলমাত্র অভিযোগ করে যে এটি একটি ব্যাচের প্রথম বিবৃতি হওয়া উচিত, এটি হ'ল কারণ এটির আগে একটি ব্যাচ বিভাজক রয়েছে, তবে এটি এখনও একটি ত্রুটি ছুঁড়ে।
ট্রায়ঙ্কো

36

এটি আমার তাত্ক্ষণিক সমস্যা সমাধানের জন্য একসাথে নক করলাম।

private void ExecuteBatchNonQuery(string sql, SqlConnection conn) {
    string sqlBatch = string.Empty;
    SqlCommand cmd = new SqlCommand(string.Empty, conn);
    conn.Open();
    sql += "\nGO";   // make sure last batch is executed.
    try {
        foreach (string line in sql.Split(new string[2] { "\n", "\r" }, StringSplitOptions.RemoveEmptyEntries)) {
            if (line.ToUpperInvariant().Trim() == "GO") {
                cmd.CommandText = sqlBatch;
                cmd.ExecuteNonQuery();
                sqlBatch = string.Empty;
            } else {
                sqlBatch += line + "\n";
            }
        }            
    } finally {
        conn.Close();
    }
}

এটির জন্য জি কমান্ডগুলি তাদের নিজস্ব লাইনে থাকা প্রয়োজন এবং এটি ব্লক-মন্তব্যগুলি সনাক্ত করতে পারে না, সুতরাং এই ধরণের জিনিসটি বিভক্ত হবে এবং ত্রুটির কারণ ঘটবে:

ExecuteBatchNonQuery(@"
    /*
    GO
    */", conn);

এটি দুর্দান্ত যে আমি প্রয়োজন হলে এটি সহজেই এসকিএলসি-তে অভিযোজিত করতে পারি - অন্য কোডটি এসকিএল সংযোগের ক্লাস এবং কমান্ড ব্যবহার করে।
ব্লু টোক

আমি এই কোডটি একটি এসকিউএল স্ক্রিপ্টের সাথে বেশ কয়েকটি সঞ্চিত প্রক্রিয়া সহ চালাতে চাই, তবে আমি কিছুটা বিভ্রান্ত হয়ে পড়েছি, এটি এসকিউএল কোথায় পড়ে? আপনি যখন 'শেষ ব্যাচ' উল্লেখ করেন আপনি কি এসকিউএল কোডটি বোঝায়? এবং যদি তাই হয়, আপনি শেষ ব্যাচটি কীভাবে নির্ধারণ করবেন, এবং আমি যদি সব ব্যাচ কেবল শেষ না চালাতে চাই? আমি জানি অনেকগুলি প্রশ্ন, তবে উত্তর দেওয়ার সময় থাকলে আপনার ধন্যবাদ।
ব্যবহারকারী1676874

আপনি এসকিউএলটিকে স্ট্রিং হিসাবে ফাংশনে পাস করুন: string sql- এটি সম্পূর্ণ স্ক্রিপ্ট। আমি যখন একটি "ব্যাচ" উল্লেখ করি, তখন আমার অর্থ দুটি "জিও" স্টেটমেন্টের মধ্যে এসকিউএল কোডের একটি অংশ। কোডটি GOস্ক্রিপ্টের শেষে একটি যুক্ত করে যাতে আপনার স্ক্রিপ্টটি একটি দিয়ে শেষ না করা হলে প্রান্তের অভ্যন্তরের কোডটি foreachশেষ ব্যাচটি এড়িয়ে যায় না GO। সুতরাং লিখিত কোডটি সমস্ত এসকিউএল কার্যকর করবে।
ব্লারগবার্ড

আমি একটি এক্সটেনশান পদ্ধতি তৈরি করেছি: অভ্যন্তরীণ স্ট্যাটিক ক্লাস স্ক্যালকম্যান্ডহেল্পার {অভ্যন্তরীণ স্ট্যাটিক শূন্য এক্সিকিউটব্যাচ ননকুয়েরি (এই স্ক্যালকম্যান্ড সেন্টিমিটার, স্ট্রিং এসকিউএল)
রব সেডগউইক

4
আপনি যদি কিছুটা দক্ষ হতে চান তবে আপনি তার StringBuilder sqlBatchপরিবর্তে ব্যবহার করতে পারেন ।
লিই

11

এটি সম্পাদন করার জন্য আপনি এসকিউএল পরিচালন অবজেক্টগুলি ব্যবহার করতে পারেন । এগুলি একই পদক্ষেপ যা ম্যানেজমেন্ট স্টুডিও ক্যোরিগুলি সম্পাদন করতে ব্যবহার করে। আমি বিশ্বাস করি Server.ConnectionContext.ExecuteNonQuery()আপনার যা প্রয়োজন তা সম্পাদন করবেন।


6

"জিও" ব্যাচের বিভাজক কীওয়ার্ডটি আসলে এসকিউএল ম্যানেজমেন্ট স্টুডিও নিজেই ব্যবহার করে, যাতে এটি জানতে পারে যে এটি যে ব্যাচগুলি সার্ভারে প্রেরণ করছে তা কোথায় শেষ করতে হবে, এবং এটি এসকিউএল সার্ভারে পাস করা হয়নি। এমনকি আপনি চাইলে ম্যানেজমেন্ট স্টুডিওতে কীওয়ার্ডটি পরিবর্তন করতে পারেন।


6

আমি এটিকে কয়েকবার তাকিয়ে দেখি ইএফ বাস্তবায়নের জন্য সিদ্ধান্ত নিয়েছে কিছুটা পরিবর্তিতSqlConnection

public static void ExecuteSqlScript(this SqlConnection sqlConnection, string sqlBatch)
        {
            // Handle backslash utility statement (see http://technet.microsoft.com/en-us/library/dd207007.aspx)
            sqlBatch = Regex.Replace(sqlBatch, @"\\(\r\n|\r|\n)", string.Empty);

            // Handle batch splitting utility statement (see http://technet.microsoft.com/en-us/library/ms188037.aspx)
            var batches = Regex.Split(
                sqlBatch,
                string.Format(CultureInfo.InvariantCulture, @"^\s*({0}[ \t]+[0-9]+|{0})(?:\s+|$)", BatchTerminator),
                RegexOptions.IgnoreCase | RegexOptions.Multiline);

            for (int i = 0; i < batches.Length; ++i)
            {
                // Skip batches that merely contain the batch terminator
                if (batches[i].StartsWith(BatchTerminator, StringComparison.OrdinalIgnoreCase) ||
                    (i == batches.Length - 1 && string.IsNullOrWhiteSpace(batches[i])))
                {
                    continue;
                }

                // Include batch terminator if the next element is a batch terminator
                if (batches.Length > i + 1 &&
                    batches[i + 1].StartsWith(BatchTerminator, StringComparison.OrdinalIgnoreCase))
                {
                    int repeatCount = 1;

                    // Handle count parameter on the batch splitting utility statement
                    if (!string.Equals(batches[i + 1], BatchTerminator, StringComparison.OrdinalIgnoreCase))
                    {
                        repeatCount = int.Parse(Regex.Match(batches[i + 1], @"([0-9]+)").Value, CultureInfo.InvariantCulture);
                    }

                    for (int j = 0; j < repeatCount; ++j)
                    {
                       var command = sqlConnection.CreateCommand();
                       command.CommandText = batches[i];
                       command.ExecuteNonQuery();
                    }
                }
                else
                {
                    var command = sqlConnection.CreateCommand();
                    command.CommandText = batches[i];
                    command.ExecuteNonQuery();
                }
            }
        }

আপনাকে ধন্যবাদ ফিলিপ কর্ডাস যদিও এটি কোনও উত্তর হিসাবে চিহ্নিত করা হয়নি এটি আমাকে কবজির মতো সাহায্য করেছে! আমাদের কাছে প্রচুর স্ক্রিপ্ট ছিল যেখানে ব্যাচটর্মিনেটরের বিভিন্ন উপায়ে যেমন উপরের এবং নিম্নের সংমিশ্রণের (গো, গো, যান ইত্যাদি) উল্লেখ করা হয়েছিল এবং সর্বাধিক বারের সাথে এটি ফাঁকা স্থান বা শীর্ষস্থান রেখেছিল যা সি # এর মাধ্যমে মৃত্যুদন্ড কার্যকর করার জন্য একটি বড় সমস্যা সৃষ্টি করেছিল ... . ধন্যবাদ !!
দিপাক্রিসওয়াদকার

4
@ দিপাক্রিসওয়াদকর হ্যাঁ এই প্রশ্নটি কয়েকবার লক করেছেন এবং প্রদত্ত জবাবগুলির কোনওোটাই আমার প্রয়োজনীয়তা পূরণ করে না, তাই ইএফ বাস্তবায়নের দিকে নজর দেওয়া ভাল বলে আমি উত্তর পোস্ট করেছি।
ফিলিপ কর্ডাস

দুর্দান্ত উত্তর, এটি একটি
মোহন

@Really এটিকে এজেন্টি ফ্রেমওয়ার্ক টিমের কাছেও রিপোর্ট করা উচিত। আমি যেমন বলেছিলাম এটি সামান্য পরিবর্তন সহ কেবল একটি অনুলিপি।
ফিলিপ কর্ডাস


4

ব্লগারবার্ডের সমাধানের ভিত্তিতে।

foreach (var sqlBatch in commandText.Split(new[] { "GO" }, StringSplitOptions.RemoveEmptyEntries))
{
   sqlCommand.CommandText = sqlBatch;
   sqlCommand.ExecuteNonQuery();
}

4
নতুন []
G

4
নতুন [] G "যান", "যান", "যান", "জিও"}
ব্র্যান্ডন ওয়ার্ড

GOTO- বিবৃতি বা মন্তব্যগুলির মতো আপনার কোডটিতে দুটি অক্ষরের জন্য আপনার অন্য কোনও ব্যবহার না হওয়া পর্যন্ত কাজ করে।
প্যাট্রিক

3

আপনি যদি এসএমও ব্যবহার করতে না চান, উদাহরণস্বরূপ যেহেতু আপনার ক্রস-প্ল্যাটফর্ম হওয়া দরকার, আপনি সাব টেক্সট থেকে স্ক্রিপ্টস্প্লিটার ক্লাসও ব্যবহার করতে পারেন।

এখানে সি # ও ভিবি.এনইটি বাস্তবায়ন রয়েছে

ব্যবহার:

    string strSQL = @"
SELECT * FROM INFORMATION_SCHEMA.columns
GO
SELECT * FROM INFORMATION_SCHEMA.views
";

    foreach(string Script in new Subtext.Scripting.ScriptSplitter(strSQL ))
    {
        Console.WriteLine(Script);
    }

আপনার যদি মাল্টলাইন সি-স্টাইলের মন্তব্যে সমস্যা হয় তবে মন্তব্যগুলি রিজেজ সহ সরিয়ে ফেলুন:

static string RemoveCstyleComments(string strInput)
{
    string strPattern = @"/[*][\w\d\s]+[*]/";
    //strPattern = @"/\*.*?\*/"; // Doesn't work
    //strPattern = "/\\*.*?\\*/"; // Doesn't work
    //strPattern = @"/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/ "; // Doesn't work
    //strPattern = @"/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/ "; // Doesn't work

    // http://stackoverflow.com/questions/462843/improving-fixing-a-regex-for-c-style-block-comments
    strPattern = @"/\*(?>(?:(?>[^*]+)|\*(?!/))*)\*/";  // Works !

    string strOutput = System.Text.RegularExpressions.Regex.Replace(strInput, strPattern, string.Empty, System.Text.RegularExpressions.RegexOptions.Multiline);
    Console.WriteLine(strOutput);
    return strOutput;
} // End Function RemoveCstyleComments

একক লাইন মন্তব্য অপসারণ এখানে:

https://stackoverflow.com/questions/9842991/regex-to-remove-single-line-sql-comments

এই শ্রেণি /* Go */কেস বিবেচনা করে?
এডগার্টটিজে

@ সিমনোর: বিভাজনে নেই, আপনি বিভক্ত হওয়ার আগে আপনি রেজেক্সের সাহায্যে মাল্টলাইন-মন্তব্যগুলি সরাতে পারেন।
স্টিফান স্টেইগার

2

আমিও একই সমস্যার মুখোমুখি হয়েছিলাম এবং আমি অন্য কোনও উপায় খুঁজে পেলাম না তবে একক এসকিউএল অপারেশনকে পৃথক ফাইলে বিভক্ত করে, তারপরে সেগুলি ক্রমানুসারে চালিয়েছি।

স্পষ্টতই সমস্যাটি ডিএমএল কমান্ডের তালিকার নয়, এগুলি মাঝখানে জিও ছাড়া কার্যকর করা যেতে পারে; ডিডিএল সহ বিভিন্ন গল্প (তৈরি করুন, পরিবর্তন করুন, ড্রপ করুন ...)


2

আপনি যদি এসএমও রুটে যেতে না চান তবে আপনি "GO" এর জন্য অনুসন্ধান এবং প্রতিস্থাপন করতে পারেন; " এবং ক্যোয়ারী যেমন আপনি চান। নোট করুন যে সলিয়ে শেষ ফলাফল সেটটি ফিরে আসবে।


4
তারা এক্সিকিউটননকুইয়ারি চালাচ্ছে। এটি এখন পর্যন্ত সহজ উপায়।
ডেভমরগানটেক্সে

4
"Go" ব্যবহার করে আপনাকে ব্যাচের পরবর্তী কমান্ডে আবার একই ভেরিয়েবলগুলি সংজ্ঞায়িত করতে সহায়তা করবে। সেমিকোলন স্থাপন করলে তা হবে না।
DDRider62

2

আমি আজই এটি এসকিউএল একটি পাঠ্য ফাইল থেকে একটি স্ট্রিংয়ে লোড করে সম্পন্ন করেছি। আমি স্ট্রিং স্প্লিট ফাংশনটি পৃথকভাবে আদেশগুলিতে পৃথকভাবে সার্ভারে প্রেরিত হয়ে পৃথক কমান্ডগুলিতে পৃথক করতে ব্যবহার করি। সরল :)

কেবল উপলব্ধি হয়ে গেছে যে আপনার টেবিলে যে কোনও নামের মধ্যে অক্ষরগুলি যেতে হবে ইত্যাদি ক্ষেত্রে আপনাকে \ nGO নিয়ে বিভক্ত হওয়া দরকার অনুমান আমি সেখানে ভাগ্যবান!


2

আপনি যদি এসএমও ব্যবহার করতে না চান (যা নীচের সমাধানের চেয়ে ভাল, তবে আমি একটি বিকল্প দিতে চাই ...) আপনি এই ফাংশনটির সাথে আপনার জিজ্ঞাসাকে বিভক্ত করতে পারেন।

এটা:

  • মন্তব্য প্রমাণ (উদাহরণ - জিও বা / * যান * /)
  • এসএসএমএসের মতো কেবল একটি নতুন লাইনে কাজ করে (উদাহরণস্বরূপ / * পরীক্ষা / * জিও কাজ করে এবং যান না হিসাবে 1 টি নির্বাচন করুন
  • স্ট্রিং প্রুফ (উদাহরণ হিসাবে মুদ্রণ 'না গো')

    private List<string> SplitScriptGo(string script)
    {
        var result = new List<string>();
        int pos1 = 0;
        int pos2 = 0;
        bool whiteSpace = true;
        bool emptyLine = true;
        bool inStr = false;
        bool inComment1 = false;
        bool inComment2 = false;
    
        while (true)
        {
            while (pos2 < script.Length && Char.IsWhiteSpace(script[pos2]))
            {
                if (script[pos2] == '\r' || script[pos2] == '\n')
                {
                    emptyLine = true;
                    inComment1 = false;
                }
    
                pos2++;
            }
    
            if (pos2 == script.Length)
                break;
    
            bool min2 = (pos2 + 1) < script.Length;
            bool min3 = (pos2 + 2) < script.Length;
    
            if (!inStr && !inComment2 && min2 && script.Substring(pos2, 2) == "--")
                inComment1 = true;
    
            if (!inStr && !inComment1 && min2 && script.Substring(pos2, 2) == "/*")
                inComment2 = true;
    
            if (!inComment1 && !inComment2 && script[pos2] == '\'')
                inStr = !inStr;
    
            if (!inStr && !inComment1 && !inComment2 && emptyLine
                && (min2 && script.Substring(pos2, 2).ToLower() == "go")
                && (!min3 || char.IsWhiteSpace(script[pos2 + 2]) || script.Substring(pos2 + 2, 2) == "--" || script.Substring(pos2 + 2, 2) == "/*"))
            {
                if (!whiteSpace)
                    result.Add(script.Substring(pos1, pos2 - pos1));
    
                whiteSpace = true;
                emptyLine = false;
                pos2 += 2;
                pos1 = pos2;
            }
            else
            {
                pos2++;
                whiteSpace = false;
    
                if (!inComment2)
                    emptyLine = false;
            }
    
            if (!inStr && inComment2 && pos2 > 1 && script.Substring(pos2 - 2, 2) == "*/")
                inComment2 = false;
        }
    
        if (!whiteSpace)
            result.Add(script.Substring(pos1));
    
        return result;
    }
    

1

স্ট্রিংকে বিভক্ত করতে এবং ব্যাচ দ্বারা ব্যাচটি কার্যকর করতে নিম্নলিখিত পদ্ধতিটি ব্যবহার করুন

using System;
using System.IO;
using System.Text.RegularExpressions;
namespace RegExTrial
{
    class Program
    {
        static void Main(string[] args)
        {
            string sql = String.Empty;
            string path=@"D:\temp\sample.sql";
            using (StreamReader reader = new StreamReader(path)) {
                sql = reader.ReadToEnd();
            }            
            //Select any GO (ignore case) that starts with at least 
            //one white space such as tab, space,new line, verticle tab etc
            string pattern="[\\s](?i)GO(?-i)";

            Regex matcher = new Regex(pattern, RegexOptions.Compiled);
            int start = 0;
            int end = 0;
            Match batch=matcher.Match(sql);
            while (batch.Success) {
                end = batch.Index;
                string batchQuery = sql.Substring(start, end - start).Trim();
                //execute the batch
                ExecuteBatch(batchQuery);
                start = end + batch.Length;
                batch = matcher.Match(sql,start);
            }

        }

        private static void ExecuteBatch(string command)
        { 
            //execute your query here
        }

    }
}

1

তৃতীয় পক্ষগুলি, রেগেক্সস, মেমরি ওভারহেডগুলি এবং বড় স্ক্রিপ্টগুলির সাথে দ্রুত কাজ এড়াতে আমি নিজের স্ট্রিম-ভিত্তিক পার্সার তৈরি করেছি। এটা

  • সিনট্যাক্স আগে পরীক্ষা করে
  • - অথবা / ** / এর সাথে মন্তব্যগুলি সনাক্ত করতে পারে

    -- some commented text
     /*
    drop table Users;
    GO
       */
    
  • 'বা "দিয়ে স্ট্রিং লিটারেলগুলি চিনতে পারে

    set @s =
        'create table foo(...);
        GO
        create index ...';
    
  • এলএফ এবং সিআর ফর্ম্যাটিং সংরক্ষণ করে
  • অবজেক্ট বডিগুলিতে মন্তব্য ব্লক সংরক্ষণ করে (সঞ্চিত পদ্ধতি, মতামত ইত্যাদি)
  • এবং অন্যান্য নির্মাণ যেমন

          gO -- commented text
    

কিভাবে ব্যবহার করে

    try
    {
        using (SqlConnection connection = new SqlConnection("Integrated Security=SSPI;Persist Security Info=True;Initial Catalog=DATABASE-NAME;Data Source=SERVER-NAME"))
        {
            connection.Open();

            int rowsAffected = SqlStatementReader.ExecuteSqlFile(
                "C:\\target-sql-script.sql",
                connection,
                // Don't forget to use the correct file encoding!!!
                Encoding.Default,
                // Indefinitely (sec)
                0
            );
        }
    }
    // implement your handlers
    catch (SqlStatementReader.SqlBadSyntaxException) { }
    catch (SqlException) { }
    catch (Exception) { }

স্ট্রিম-ভিত্তিক এসকিউএল স্ক্রিপ্ট রিডার

class SqlStatementReader
{
    public class SqlBadSyntaxException : Exception
    {
        public SqlBadSyntaxException(string description) : base(description) { }
        public SqlBadSyntaxException(string description, int line) : base(OnBase(description, line, null)) { }
        public SqlBadSyntaxException(string description, int line, string filePath) : base(OnBase(description, line, filePath)) { }
        private static string OnBase(string description, int line, string filePath)
        {
            if (filePath == null)
                return string.Format("Line: {0}. {1}", line, description);
            else
                return string.Format("File: {0}\r\nLine: {1}. {2}", filePath, line, description);
        }
    }

    enum SqlScriptChunkTypes
    {
        InstructionOrUnquotedIdentifier = 0,
        BracketIdentifier = 1,
        QuotIdentifierOrLiteral = 2,
        DblQuotIdentifierOrLiteral = 3,
        CommentLine = 4,
        CommentMultiline = 5,
    }

    StreamReader _sr = null;
    string _filePath = null;
    int _lineStart = 1;
    int _lineEnd = 1;
    bool _isNextChar = false;
    char _nextChar = '\0';

    public SqlStatementReader(StreamReader sr)
    {
        if (sr == null)
            throw new ArgumentNullException("StreamReader can't be null.");

        if (sr.BaseStream is FileStream)
            _filePath = ((FileStream)sr.BaseStream).Name;

        _sr = sr;
    }

    public SqlStatementReader(StreamReader sr, string filePath)
    {
        if (sr == null)
            throw new ArgumentNullException("StreamReader can't be null.");

        _sr = sr;
        _filePath = filePath;
    }

    public int LineStart { get { return _lineStart; } }
    public int LineEnd { get { return _lineEnd == 1 ? _lineEnd : _lineEnd - 1; } }

    public void LightSyntaxCheck()
    {
        while (ReadStatementInternal(true) != null) ;
    }

    public string ReadStatement()
    {
        for (string s = ReadStatementInternal(false); s != null; s = ReadStatementInternal(false))
        {
            // skip empty
            for (int i = 0; i < s.Length; i++)
            {
                switch (s[i])
                {
                    case ' ': continue;
                    case '\t': continue;
                    case '\r': continue;
                    case '\n': continue;
                    default:
                        return s;
                }
            }
        }
        return null;
    }

    string ReadStatementInternal(bool syntaxCheck)
    {
        if (_isNextChar == false && _sr.EndOfStream)
            return null;

        StringBuilder allLines = new StringBuilder();
        StringBuilder line = new StringBuilder();
        SqlScriptChunkTypes nextChunk = SqlScriptChunkTypes.InstructionOrUnquotedIdentifier;
        SqlScriptChunkTypes currentChunk = SqlScriptChunkTypes.InstructionOrUnquotedIdentifier;
        char ch = '\0';
        int lineCounter = 0;
        int nextLine = 0;
        int currentLine = 0;
        bool nextCharHandled = false;
        bool foundGO;
        int go = 1;

        while (ReadChar(out ch))
        {
            if (nextCharHandled == false)
            {
                currentChunk = nextChunk;
                currentLine = nextLine;

                switch (currentChunk)
                {
                    case SqlScriptChunkTypes.InstructionOrUnquotedIdentifier:

                        if (ch == '[')
                        {
                            currentChunk = nextChunk = SqlScriptChunkTypes.BracketIdentifier;
                            currentLine = nextLine = lineCounter;
                        }
                        else if (ch == '"')
                        {
                            currentChunk = nextChunk = SqlScriptChunkTypes.DblQuotIdentifierOrLiteral;
                            currentLine = nextLine = lineCounter;
                        }
                        else if (ch == '\'')
                        {
                            currentChunk = nextChunk = SqlScriptChunkTypes.QuotIdentifierOrLiteral;
                            currentLine = nextLine = lineCounter;
                        }
                        else if (ch == '-' && (_isNextChar && _nextChar == '-'))
                        {
                            nextCharHandled = true;
                            currentChunk = nextChunk = SqlScriptChunkTypes.CommentLine;
                            currentLine = nextLine = lineCounter;
                        }
                        else if (ch == '/' && (_isNextChar && _nextChar == '*'))
                        {
                            nextCharHandled = true;
                            currentChunk = nextChunk = SqlScriptChunkTypes.CommentMultiline;
                            currentLine = nextLine = lineCounter;
                        }
                        else if (ch == ']')
                        {
                            throw new SqlBadSyntaxException("Incorrect syntax near ']'.", _lineEnd + lineCounter, _filePath);
                        }
                        else if (ch == '*' && (_isNextChar && _nextChar == '/'))
                        {
                            throw new SqlBadSyntaxException("Incorrect syntax near '*'.", _lineEnd + lineCounter, _filePath);
                        }
                        break;

                    case SqlScriptChunkTypes.CommentLine:

                        if (ch == '\r' && (_isNextChar && _nextChar == '\n'))
                        {
                            nextCharHandled = true;
                            currentChunk = nextChunk = SqlScriptChunkTypes.InstructionOrUnquotedIdentifier;
                            currentLine = nextLine = lineCounter;
                        }
                        else if (ch == '\n' || ch == '\r')
                        {
                            currentChunk = nextChunk = SqlScriptChunkTypes.InstructionOrUnquotedIdentifier;
                            currentLine = nextLine = lineCounter;
                        }
                        break;

                    case SqlScriptChunkTypes.CommentMultiline:

                        if (ch == '*' && (_isNextChar && _nextChar == '/'))
                        {
                            nextCharHandled = true;
                            nextChunk = SqlScriptChunkTypes.InstructionOrUnquotedIdentifier;
                            nextLine = lineCounter;
                        }
                        else if (ch == '/' && (_isNextChar && _nextChar == '*'))
                        {
                            throw new SqlBadSyntaxException("Missing end comment mark '*/'.", _lineEnd + currentLine, _filePath);
                        }
                        break;

                    case SqlScriptChunkTypes.BracketIdentifier:

                        if (ch == ']')
                        {
                            nextChunk = SqlScriptChunkTypes.InstructionOrUnquotedIdentifier;
                            nextLine = lineCounter;
                        }
                        break;

                    case SqlScriptChunkTypes.DblQuotIdentifierOrLiteral:

                        if (ch == '"')
                        {
                            if (_isNextChar && _nextChar == '"')
                            {
                                nextCharHandled = true;
                            }
                            else
                            {
                                nextChunk = SqlScriptChunkTypes.InstructionOrUnquotedIdentifier;
                                nextLine = lineCounter;
                            }
                        }
                        break;

                    case SqlScriptChunkTypes.QuotIdentifierOrLiteral:

                        if (ch == '\'')
                        {
                            if (_isNextChar && _nextChar == '\'')
                            {
                                nextCharHandled = true;
                            }
                            else
                            {
                                nextChunk = SqlScriptChunkTypes.InstructionOrUnquotedIdentifier;
                                nextLine = lineCounter;
                            }
                        }
                        break;
                }
            }
            else
                nextCharHandled = false;

            foundGO = false;
            if (currentChunk == SqlScriptChunkTypes.InstructionOrUnquotedIdentifier || go >= 5 || (go == 4 && currentChunk == SqlScriptChunkTypes.CommentLine))
            {
                // go = 0 - break, 1 - begin of the string, 2 - spaces after begin of the string, 3 - G or g, 4 - O or o, 5 - spaces after GO, 6 - line comment after valid GO
                switch (go)
                {
                    case 0:
                        if (ch == '\r' || ch == '\n')
                            go = 1;
                        break;
                    case 1:
                        if (ch == ' ' || ch == '\t')
                            go = 2;
                        else if (ch == 'G' || ch == 'g')
                            go = 3;
                        else if (ch != '\n' && ch != '\r')
                            go = 0;
                        break;
                    case 2:
                        if (ch == 'G' || ch == 'g')
                            go = 3;
                        else if (ch == '\n' || ch == '\r')
                            go = 1;
                        else if (ch != ' ' && ch != '\t')
                            go = 0;
                        break;
                    case 3:
                        if (ch == 'O' || ch == 'o')
                            go = 4;
                        else if (ch == '\n' || ch == '\r')
                            go = 1;
                        else
                            go = 0;
                        break;
                    case 4:
                        if (ch == '\r' && (_isNextChar && _nextChar == '\n'))
                            go = 5;
                        else if (ch == '\n' || ch == '\r')
                            foundGO = true;
                        else if (ch == ' ' || ch == '\t')
                            go = 5;
                        else if (ch == '-' && (_isNextChar && _nextChar == '-'))
                            go = 6;
                        else
                            go = 0;
                        break;
                    case 5:
                        if (ch == '\r' && (_isNextChar && _nextChar == '\n'))
                            go = 5;
                        else if (ch == '\n' || ch == '\r')
                            foundGO = true;
                        else if (ch == '-' && (_isNextChar && _nextChar == '-'))
                            go = 6;
                        else if (ch != ' ' && ch != '\t')
                            throw new SqlBadSyntaxException("Incorrect syntax was encountered while parsing go.", _lineEnd + lineCounter, _filePath);
                        break;
                    case 6:
                        if (ch == '\r' && (_isNextChar && _nextChar == '\n'))
                            go = 6;
                        else if (ch == '\n' || ch == '\r')
                            foundGO = true;
                        break;
                    default:
                        go = 0;
                        break;
                }
            }
            else
                go = 0;

            if (foundGO)
            {
                if (ch == '\r' || ch == '\n')
                {
                    ++lineCounter;
                }
                // clear GO
                string s = line.Append(ch).ToString();
                for (int i = 0; i < s.Length; i++)
                {
                    switch (s[i])
                    {
                        case ' ': continue;
                        case '\t': continue;
                        case '\r': continue;
                        case '\n': continue;
                        default:
                            _lineStart = _lineEnd;
                            _lineEnd += lineCounter;
                            return allLines.Append(s.Substring(0, i)).ToString();
                    }
                }
                return string.Empty;
            }

            // accumulate by string
            if (ch == '\r' && (_isNextChar == false || _nextChar != '\n'))
            {
                ++lineCounter;
                if (syntaxCheck == false)
                    allLines.Append(line.Append('\r').ToString());
                line.Clear();
            }
            else if (ch == '\n')
            {
                ++lineCounter;
                if (syntaxCheck == false)
                    allLines.Append(line.Append('\n').ToString());
                line.Clear();
            }
            else
            {
                if (syntaxCheck == false)
                    line.Append(ch);
            }
        }

        // this is the end of the stream, return it without GO, if GO exists
        switch (currentChunk)
        {
            case SqlScriptChunkTypes.InstructionOrUnquotedIdentifier:
            case SqlScriptChunkTypes.CommentLine:
                break;
            case SqlScriptChunkTypes.CommentMultiline:
                if (nextChunk != SqlScriptChunkTypes.InstructionOrUnquotedIdentifier)
                    throw new SqlBadSyntaxException("Missing end comment mark '*/'.", _lineEnd + currentLine, _filePath);
                break;
            case SqlScriptChunkTypes.BracketIdentifier:
                if (nextChunk != SqlScriptChunkTypes.InstructionOrUnquotedIdentifier)
                    throw new SqlBadSyntaxException("Unclosed quotation mark [.", _lineEnd + currentLine, _filePath);
                break;
            case SqlScriptChunkTypes.DblQuotIdentifierOrLiteral:
                if (nextChunk != SqlScriptChunkTypes.InstructionOrUnquotedIdentifier)
                    throw new SqlBadSyntaxException("Unclosed quotation mark \".", _lineEnd + currentLine, _filePath);
                break;
            case SqlScriptChunkTypes.QuotIdentifierOrLiteral:
                if (nextChunk != SqlScriptChunkTypes.InstructionOrUnquotedIdentifier)
                    throw new SqlBadSyntaxException("Unclosed quotation mark '.", _lineEnd + currentLine, _filePath);
                break;
        }

        if (go >= 4)
        {
            string s = line.ToString();
            for (int i = 0; i < s.Length; i++)
            {
                switch (s[i])
                {
                    case ' ': continue;
                    case '\t': continue;
                    case '\r': continue;
                    case '\n': continue;
                    default:
                        _lineStart = _lineEnd;
                        _lineEnd += lineCounter + 1;
                        return allLines.Append(s.Substring(0, i)).ToString();
                }
            }
        }

        _lineStart = _lineEnd;
        _lineEnd += lineCounter + 1;
        return allLines.Append(line.ToString()).ToString();
    }

    bool ReadChar(out char ch)
    {
        if (_isNextChar)
        {
            ch = _nextChar;
            if (_sr.EndOfStream)
                _isNextChar = false;
            else
                _nextChar = Convert.ToChar(_sr.Read());
            return true;
        }
        else if (_sr.EndOfStream == false)
        {
            ch = Convert.ToChar(_sr.Read());
            if (_sr.EndOfStream == false)
            {
                _isNextChar = true;
                _nextChar = Convert.ToChar(_sr.Read());
            }
            return true;
        }
        else
        {
            ch = '\0';
            return false;
        }
    }

    public static int ExecuteSqlFile(string filePath, SqlConnection connection, Encoding fileEncoding, int commandTimeout)
    {
        int rowsAffected = 0;
        using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read))
        {
            // Simple syntax check (you can comment out these two lines below)
            new SqlStatementReader(new StreamReader(fs, fileEncoding)).LightSyntaxCheck();
            fs.Seek(0L, SeekOrigin.Begin);

            // Read statements without GO
            SqlStatementReader rd = new SqlStatementReader(new StreamReader(fs, fileEncoding));
            string stmt;
            while ((stmt = rd.ReadStatement()) != null)
            {
                using (SqlCommand cmd = connection.CreateCommand())
                {
                    cmd.CommandText = stmt;
                    cmd.CommandTimeout = commandTimeout;
                    int i = cmd.ExecuteNonQuery();
                    if (i > 0)
                        rowsAffected += i;
                }
            }
        }
        return rowsAffected;
    }
}

0

জাভাতেও আমার একই সমস্যা ছিল এবং আমি এটি কিছুটা যুক্তি এবং রেজেক্স দিয়ে সমাধান করেছি। আমি বিশ্বাস করি একই যুক্তি প্রয়োগ করা যেতে পারে irst প্রথম আমি স্লোক ফাইল থেকে মেমরিতে পড়ি। তারপরে আমি নিম্নলিখিত যুক্তি প্রয়োগ করি। এটি পূর্বে যা বলা হয়েছিল তা অনেক বেশি তবে আমি বিশ্বাস করি যে রেগেক্স শব্দের সাথে আবদ্ধ হওয়া কোনও নতুন লাইন চরটি আশা করার চেয়ে নিরাপদ।

String pattern = "\\bGO\\b|\\bgo\\b";

String[] splitedSql = sql.split(pattern);
for (String chunk : splitedSql) {
  getJdbcTemplate().update(chunk);
}

এটি মূলত sql স্ট্রিংটি বর্গক্ষেত্রের একটি অ্যারেতে বিভক্ত করে। রেজেক্স মূলত পুরো 'গো' শব্দগুলি নিম্নের বা বড় হাতের অক্ষর সনাক্ত করতে হয়। তারপরে আপনি ক্রমিকভাবে বিভিন্ন কোয়েরি চালাবেন।


4
সাবধানতা: আপনি কীভাবে এটিকে বিভক্ত করবেন? insert into books values ('1478355824', 'An Introduction To Programming in Go (paperback)', 9.00)
ব্লারগবার্ড

ভাল পয়েন্ট :-) আমার পরিস্থিতিতে ডেটা প্রবেশ করানো হয়নি। কেবল সারণী, সঞ্চিত পদ্ধতি এবং ফাংশন তৈরি করছিল। শব্দটি আমার বিশেষ ক্ষেত্রে আরও কার্যকর ছিল কারণ এটি সর্বশেষ লাইনে 'গো' র যত্ন নিয়েছিল।
jbrunodomingues

0

আমি এই একই সমস্যাটিকে আঘাত করেছি এবং শেষ পর্যন্ত কেবল একটি সরল স্ট্রিং প্রতিস্থাপন করে সমাধান করুন, জিও শব্দটির পরিবর্তে একটি আধা-কোলন (;)

ইন-লাইন মন্তব্য, ব্লক মন্তব্য এবং জিও কমান্ড সহ স্ক্রিপ্টগুলি সম্পাদন করার সময় সমস্ত ঠিকঠাক কাজ করছে বলে মনে হচ্ছে

public static bool ExecuteExternalScript(string filePath)
{
    using (StreamReader file = new StreamReader(filePath))
    using (SqlConnection conn = new SqlConnection(dbConnStr))
    {
        StringBuilder sql = new StringBuilder();

        string line;
        while ((line = file.ReadLine()) != null)
        {
            // replace GO with semi-colon
            if (line == "GO")
                sql.Append(";");
            // remove inline comments
            else if (line.IndexOf("--") > -1)
                sql.AppendFormat(" {0} ", line.Split(new string[] { "--" }, StringSplitOptions.None)[0]);
            // just the line as it is
            else
                sql.AppendFormat(" {0} ", line);
        }
        conn.Open();

        SqlCommand cmd = new SqlCommand(sql.ToString(), conn);
        cmd.ExecuteNonQuery();
    }

    return true;
}

4
এটি ডিডিএল কমান্ডগুলির পক্ষে কাজ করবে না, যা তাদের নিজস্ব ব্যাচে থাকা দরকার। উদাহরণস্বরূপ টেবিল তৈরি ও পরিবর্তন করুন
ব্লারগবার্ড

এছাড়াও, আপনি অকারণে মন্তব্যগুলি মুছে ফেলছেন বলে মনে হচ্ছে .. যা কোনও স্ট্রিং যুক্ত ভঙ্গ করবে --, উদাহরণস্বরূপ।
ব্লারগার্ড 3'15

হাই ব্লর্গবার্ড - এসকিউএল সার্ভার 2012 ডিডিএল বিবৃতি ঠিকঠাক পরিচালনা করছে বলে মনে হচ্ছে। আমি যে স্ক্রিপ্টগুলি ব্যবহার করছিলাম সেগুলি হ'ল আমাকে পুরো ডাটাবেস কাঠামো পুনর্নির্মাণের জন্য, বর্তমান কাঠামোটি মুছে ফেলা, টেবিলগুলি তৈরি করা, সূচিপত্র যুক্ত করা ইত্যাদি thought একটি ব্যাচও শেষ করেছেন?
মরভেল

মন্তব্যগুলি অপসারণ করাও কারণ এটি এসকিউএলের একটি একক লাইন তৈরি করবে, মন্তব্যের পরে যে কোনও এসকিউএল মন্তব্য করা হবে, তবে আমি আপনার বক্তব্য রাখি যদি সেখানে একটি স্ট্রিং থাকে তবে - এটি কোনও মন্তব্য ছিল না।
মরভেল

4
আহ ঠিক আছে, কেবল এটি সন্ধান করেছেন: "ডিফল্ট তৈরি করুন, ফাংশন তৈরি করুন, পদ্ধতি তৈরি করুন, তৈরি করুন কৌশল, ক্রিয়েট ট্রিগার, এবং ক্রিয়েট ভিউ স্টেটমেন্টগুলিকে একটি ব্যাচের অন্যান্য বিবৃতিগুলির সাথে একত্রিত করা যাবে না। ক্রিয়েট স্টেটমেন্টটি অবশ্যই ব্যাচটি শুরু করতে হবে। সবই এই ব্যাচে অনুসরণকারী অন্যান্য বিবৃতি প্রথম ক্রিয়েট স্টেটমেন্টের সংজ্ঞার অংশ হিসাবে ব্যাখ্যা করা হবে A একটি টেবিল পরিবর্তন করা যাবে না এবং নতুন কলাম একই ব্যাচে রেফারেন্স করা যাবে। "
ব্লারগার্ড 3'15

-1

এখনও কারও জন্য সমস্যা রয়েছে। আপনি অফিসিয়াল মাইক্রোসফ্ট এসএমও ব্যবহার করতে পারেন

https://docs.microsoft.com/en-us/sql/relational-databases/server-management-objects-smo/overview-smo?view=sql-server-2017

using (var connection = new SqlConnection(connectionString))
{
  var server = new Server(new ServerConnection(connection));
  server.ConnectionContext.ExecuteNonQuery(sql);
}

এটি শীর্ষে ভোট দেওয়া, গৃহীত উত্তরগুলির মধ্যে কিছু যুক্ত করে না, যা এসএমওর প্রস্তাবও দেয় (10 বছর আগে পোস্ট করা হয়েছিল!)।
ব্লর্গবার্ড 21

-4

অনেক কঠিন :)

", @" এর সাথে প্রতিস্থাপন করে স্ট্রিংয়ের অ্যারে তৈরি করুন []

            string[] str ={
                @"
USE master;
",@"


CREATE DATABASE " +con_str_initdir+ @";
",@"
-- Verify the database files and sizes
--SELECT name, size, size*1.0/128 AS [Size in MBs] 
--SELECT name 
--FROM sys.master_files
--WHERE name = N'" + con_str_initdir + @"';
--GO

USE " + con_str_initdir + @";
",@"

SET ANSI_NULLS ON
",@"
SET QUOTED_IDENTIFIER ON
",@"

IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Customers]') AND type in (N'U'))
BEGIN
CREATE TABLE [dbo].[Customers](
    [CustomerID] [int] IDENTITY(1,1) NOT NULL,
    [CustomerName] [nvarchar](50) NULL,
 CONSTRAINT [PK_Customers] PRIMARY KEY CLUSTERED 
(
    [CustomerID] ASC
)WITH (PAD_INDEX  = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
END
",@"



SET ANSI_NULLS ON
",@"
SET QUOTED_IDENTIFIER ON
",@"
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[GOODS]') AND type in (N'U'))
BEGIN
CREATE TABLE [dbo].[GOODS](
    [GoodsID] [int] IDENTITY(1,1) NOT NULL,
    [GoodsName] [nvarchar](50) NOT NULL,
    [GoodsPrice] [float] NOT NULL,
 CONSTRAINT [PK_GOODS] PRIMARY KEY CLUSTERED 
(
    [GoodsID] ASC
)WITH (PAD_INDEX  = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
END
",@"
SET ANSI_NULLS ON
",@"
SET QUOTED_IDENTIFIER ON
",@"
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Orders]') AND type in (N'U'))
BEGIN
CREATE TABLE [dbo].[Orders](
    [OrderID] [int] IDENTITY(1,1) NOT NULL,
    [CustomerID] [int] NOT NULL,
    [Date] [smalldatetime] NOT NULL,
 CONSTRAINT [PK_Orders] PRIMARY KEY CLUSTERED 
(
    [OrderID] ASC
)WITH (PAD_INDEX  = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
END
",@"
SET ANSI_NULLS ON
",@"
SET QUOTED_IDENTIFIER ON
",@"
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[OrderDetails]') AND type in (N'U'))
BEGIN
CREATE TABLE [dbo].[OrderDetails](
    [OrderID] [int] NOT NULL,
    [GoodsID] [int] NOT NULL,
    [Qty] [int] NOT NULL,
    [Price] [float] NOT NULL,
 CONSTRAINT [PK_OrderDetails] PRIMARY KEY CLUSTERED 
(
    [OrderID] ASC,
    [GoodsID] ASC
)WITH (PAD_INDEX  = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
END
",@"

SET ANSI_NULLS ON
",@"
SET QUOTED_IDENTIFIER ON
",@"
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[InsertCustomers]') AND type in (N'P', N'PC'))
BEGIN
EXEC dbo.sp_executesql @statement = N'-- =============================================
-- Author:      <Author,,Name>
-- Create date: <Create Date,,>
-- Description: <Description,,>
-- =============================================
create PROCEDURE [dbo].[InsertCustomers]
 @CustomerName nvarchar(50),
 @Identity int OUT
AS
INSERT INTO Customers (CustomerName) VALUES(@CustomerName)
SET @Identity = SCOPE_IDENTITY()

' 
END
",@"
IF NOT EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_Orders_Customers]') AND parent_object_id = OBJECT_ID(N'[dbo].[Orders]'))
ALTER TABLE [dbo].[Orders]  WITH CHECK ADD  CONSTRAINT [FK_Orders_Customers] FOREIGN KEY([CustomerID])
REFERENCES [dbo].[Customers] ([CustomerID])
ON UPDATE CASCADE
",@"
ALTER TABLE [dbo].[Orders] CHECK CONSTRAINT [FK_Orders_Customers]
",@"
IF NOT EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_OrderDetails_GOODS]') AND parent_object_id = OBJECT_ID(N'[dbo].[OrderDetails]'))
ALTER TABLE [dbo].[OrderDetails]  WITH CHECK ADD  CONSTRAINT [FK_OrderDetails_GOODS] FOREIGN KEY([GoodsID])
REFERENCES [dbo].[GOODS] ([GoodsID])
ON UPDATE CASCADE
",@"
ALTER TABLE [dbo].[OrderDetails] CHECK CONSTRAINT [FK_OrderDetails_GOODS]
",@"
IF NOT EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_OrderDetails_Orders]') AND parent_object_id = OBJECT_ID(N'[dbo].[OrderDetails]'))
ALTER TABLE [dbo].[OrderDetails]  WITH CHECK ADD  CONSTRAINT [FK_OrderDetails_Orders] FOREIGN KEY([OrderID])
REFERENCES [dbo].[Orders] ([OrderID])
ON UPDATE CASCADE
ON DELETE CASCADE
",@"
ALTER TABLE [dbo].[OrderDetails] CHECK CONSTRAINT [FK_OrderDetails_Orders]


                "};


            for(int i =0; i<str.Length;i++)     
            {
                myCommand.CommandText=str[i];
                try
                {
                myCommand.ExecuteNonQuery();
                }
                catch (SystemException ee)
                {
                    MessageBox.Show("Error   "+ee.ToString());
                }

            }

সবই, উপভোগ করুন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.