استرداد برمجيا SQL Server Standure Sourdure Source مماثلة للمصدر الذي تم إرجاعه بواسطة SQL Server Management Studio GUI؟

StackOverflow https://stackoverflow.com/questions/467482

سؤال

أي مؤشرات حول كيف يمكنني الحصول على مصدر الإجراء المخزن المتطابق بشكل برمجي من SQL Server 2005 ، كما هو الحال عند النقر بزر الماوس الأيمن على هذا الإجراء المخزن في استوديو SQL Server Management وتحديد Modify؟

أحاول استخدام SMO ، ولكن هناك بعض الاختلافات النصية. لقد قام الإجراء دائمًا بإنشاء ، وليس تغيير ، وهناك بعض الاختلافات في الرأس ، مثل GOS المفقودة في الإصدار الذي أحصل عليه برمجيًا. يمكنني إصلاحها ، ولكن ربما هناك طريقة أفضل؟

مرة أخرى ، أنا في SQL Server 2005 ، باستخدام SMSE. باستخدام SMO عبر Visual Studio 8 2008.

تحديث: حصلت على بعض الإجابات التي تخبر أساسيات كيفية استرداد الإجراء المخزن. ما أبحث عنه هو استرداد النص متطابق (أو متطابق تقريبًا) لما يولده واجهة المستخدم الرسومية.

مثال: بالنسبة لـ SP_MYSP ، انقر بزر الماوس الأيمن في استوديو الإدارة ، حدد تعديل. هذا يولد:

    USE [MY_DB]  
    GO  
    /****** Object:  StoredProcedure [dbo].[sp_mysp]    Script Date: 01/21/2009 17:43:18 ******/  
    SET ANSI_NULLS ON  
    GO  
    SET QUOTED_IDENTIFIER ON  
    GO  
    -- =============================================
    -- Author:      
    -- Create date: 
    -- Description: 
    -- =============================================
    ALTER PROCEDURE [dbo].[sp_mysp]

أرغب في الحصول على نفس الشيء برمجيًا (لاحظ GOS في الرأس ، وحقيقة أنه إجراء تغيير. من الناحية المثالية ، أود الحصول على هذا مع الحد الأدنى من التثبيت البرنامجي للمصدر الذي تم استرداده.

يسعدني الحصول على شيء يختلف فقط في تفاصيل تاريخ النص. . .

هل كانت مفيدة؟

المحلول

EXEC sp_helptext 'your procedure name';

هذا يتجنب مشكلة نهج Information_schema حيث يتم قطع الإجراء المخزن إذا كان طويلًا جدًا.

تحديث: يكتب ديفيد أن هذا ليس مطابقًا لبروكه ... ربما لأنه يعيد الخطوط كـ "سجلات" للحفاظ على التنسيق؟ إذا كنت ترغب في رؤية النتائج بتنسيق "طبيعي" أكثر ، فيمكنك استخدام CTRL-T أولاً (الإخراج كنص) ويجب أن يطبقت تمامًا كما أدخلته. إذا كنت تفعل ذلك في الكود ، فمن التافهة القيام بعمل لتجميع نتائجك بنفس الطريقة بالضبط.

تحديث 2: سيوفر هذا المصدر "إجراء إنشاء" بدلاً من "إجراء تغيير" ولكني لا أعرف أي طريقة لجعله يستخدم "Alter" بدلاً من ذلك. نوع من الشيء التافهة ، على الرغم من ذلك ، أليس كذلك؟

تحديث 3: راجع التعليقات للحصول على مزيد من الرؤية حول كيفية الحفاظ على SQL DDL (بنية قاعدة البيانات) في نظام التحكم في المصدر. هذا هو حقا مفتاح هذا السؤال.

نصائح أخرى

سيكون عليك تسليم رمزه ، SQL Profiler يكشف ما يلي.

ينفذ SMSE سلسلة طويلة من الاستفسارات عندما تنشئ البيان.

يتم استخدام الاستعلام التالي (أو أي شيء على طول خطوطه) لاستخراج النص:

SELECT
NULL AS [Text],
ISNULL(smsp.definition, ssmsp.definition) AS [Definition]
FROM
sys.all_objects AS sp
LEFT OUTER JOIN sys.sql_modules AS smsp ON smsp.object_id = sp.object_id
LEFT OUTER JOIN sys.system_sql_modules AS ssmsp ON ssmsp.object_id = sp.object_id
WHERE
(sp.type = N'P' OR sp.type = N'RF' OR sp.type='PC')and(sp.name=N'#test___________________________________________________________________________________________________________________00003EE1' and SCHEMA_NAME(sp.schema_id)=N'dbo')

يعيد إنشاء النقي الذي يتم استبداله بعد ذلك مع تغيير في الكود في مكان ما.

يتم إعداد مجموعة ANSI NULL وبيانات GO والتواريخ كلها.

اذهب مع sp_helptext ، أبسط ...

قلت برمجيا ، أليس كذلك؟ آمل أن يكون C# على ما يرام. أعلم أنك قلت إنك جربت SMO ولم تفعل ما تريد تمامًا ، لذلك ربما لن يكون هذا مثاليًا لطلبك ، ولكنه سيقرأ برمجيًا عبارات SQL الشرعية التي يمكنك تشغيلها لإعادة إنشاء الإجراء المخزن. إذا لم يكن لديه GO العبارات التي تريدها ، ربما يمكنك افتراض أن كل من السلاسل في StringCollection يمكن أن يكون GO بعد ذلك. لا يجوز لك الحصول على هذا التعليق بالتاريخ والوقت فيه ، ولكن في مشروعي السبر المماثل (أداة نشر الحمار الكبير والتي يجب أن تدعم كل شيء بشكل فردي) ، فقد فعل ذلك بشكل جيد. إذا كان لديك قاعدة سابقة تريد العمل منها ، ولا يزال لديك قاعدة البيانات الأصلية لتشغيلها عليها ، فسأفكر في رمي الجهد الأولي وإعادة تنظيف هذا الإخراج.

using System.Data.SqlClient;
using Microsoft.SqlServer.Management.Common;
using Microsoft.SqlServer.Management.Smo;
…
string connectionString = … /* some connection string */;
ServerConnection sc = new ServerConnection(connectionString);
Server s = new Server(connection);
Database db = new Database(s, … /* database name */);
StoredProcedure sp = new StoredProcedure(db, … /* stored procedure name */);
StringCollection statements = sp.Script;

استخدم عبارة SELECT التالية للحصول على كل التعريف الكامل:

select ROUTINE_DEFINITION from INFORMATION_SCHEMA.ROUTINES Where ROUTINE_NAME='someprocname'

أظن أن SSMs وغيرها من الأدوات تقرأ هذا وإجراء التغييرات عند الضرورة مثل تغيير إنشاء للتغيير. بقدر ما أعرف متاجر SQL ليس تمثيلات أخرى للإجراء

أنا أتفق مع مارك. قمت بتعيين الإخراج إلى وضع النص ثم sp_helptext 'sproc'. لدي هذا ملتصق بـ CRTL-F1 لجعله سهلاً.

ال معالج نشر البيانات يمكن تفريغ المخطط (وغيرها من الكائنات) من سطر الأوامر.

أريد فقط أن ألاحظ أنه بدلاً من استخدام Find and Respion لتغيير الإجراء لتغيير الإجراء ، فأنت كذلك لاستخدام قطرة ، يمكنك وضعه في الأعلى ويتطلب البحث عن النص.

IF exists (SELECT * FROM sys.objects 
        WHERE object_id = OBJECT_ID(N'sp_name')
            and type in ('P','V') --procedure or view
        )
    DROP sp_name
GO

إذا كنت متأكدًا من وجوده ، أعتقد أنه يمكنك فقط إسقاطه أيضًا ، لكنني لا أوصي بذلك. لا تنسى الانتقال ، حيث يجب أن يكون الإجراء هو البيان الأول والوحيد في دفعة.

أو النهج الكسول:

IF OBJECT_ID(N'sp_name') is not null
    DROP sp_name
GO

لتغيير إجراء مخزن ، إليك رمز C#:

SqlConnection con = new SqlConnection("your connection string");
con.Open();
cmd.CommandType = System.Data.CommandType.Text;
string sql = File.ReadAllText(YUOR_SP_SCRIPT_FILENAME);
cmd.CommandText = sql;   
cmd.Connection = con;
cmd.ExecuteNonQuery();
con.Close();

أشياء يجب ملاحظة:

  1. تأكد من أن المستخدم في سلسلة الاتصال له الحق في تغيير SP
  2. إزالة كل GO,SET ANSI_NULLS XX,SET QUOTED_IDENTIFIER بيانات من ملف البرنامج النصي. (إذا لم تقم بذلك ، فإن SQLCommand سوف يرمي خطأ).
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top