سؤال

هذه الصفحة من SQL Server 2008 Bol, ، يتحدث عن إجراءات CLR المخزنة ولديها قسم يسمى "معلمات قيمة الجدول" ، والتي تتحدث عن كيفية أن تكون مفيدة. هذا رائع - أحب استخدام TVPs في Procs الخاص بي ، لكن للأسف يبدو أن هذا هو المرجع الوحيد في الكون لمثل هذا الاحتمال ، والقسم لا يصف ما سيكون عليه بناء الجملة (ولا المعلومات الإضافية مرتبط في نهاية الفقرة)

بالتأكيد ، يمكنني بسهولة العثور على أوصاف لكيفية استخدام TVPs من T-SQL Procs ، أو كيفية القيام بـ CLR Procs بشكل عام. لكن كتابة proc clr يأخذ tvp؟ لا شئ. هذا كله غير معقول للغاية لأن تمرير البيانات متعددة الصفوف إلى بروك المخزنة يمثل مشكلة شائعة.

هذا يقودني إلى التساؤل عما إذا كان وجود القسم في تلك الصفحة خطأ. شخص ما من فضلك قل لي إنه ليس وأوجهني إلى مزيد من المعلومات/ الأمثلة.

تعديل

كنت على وشك نشر هذا لأحد منتديات MS أيضًا عندما صادفت هذا ، الذي يبدو أنه الظفر الأخير في التابوت. يبدو أنه لا يمكن القيام به.

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

المحلول

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

ومع ذلك ، توصلت إلى استنتاج مفاده أنه من المستحيل. أولا ، هناك قائمة التعيينات بين أنواع CLR و SQL. بالنسبة لأنواع الجداول ، لا يوجد رسم خرائط ، لذلك لا يعمل ما يلي ، على سبيل المثال:

[SqlProcedure]
public static void StoredProcedure(DataTable tvp, out int sum)
{
    return 42;
}

وثم

CREATE TYPE MyTableType AS TABLE 
(
    Id INT NOT NULL PRIMARY KEY,
    [Count] INT NOT NULL
)
GO
CREATE ASSEMBLY ClrTest FROM '<somePath>'
GO
CREATE PROCEDURE ClrTest
AS EXTERNAL NAME ClrTest.StoredProcedures.StoredProcedure
GO

مهما كان النوع الذي تحاوله (DataTable, DbDataReader, IEnumerable)، ال CREATE PROCEDURE يستمر المكالمة في إنشاء خطأ 6552: فشل إنشاء إجراء لـ "clrtest" لأن أنواع T-SQL و CLR للمعلمة "TVP" لا تتطابق.

ثانياً ، الوثائق الموجودة على الصفحة التي ربطتها بـ: لا يمكن تمرير نوع الجدول المعرفة من قبل المستخدم كمعلمة ذات قيمة جدول إلى الجدول ، أو إرجاعها ، من الإجراء المخزن المدار أو تنفيذ وظيفة في عملية خادم SQL.

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

ربما يمكنك طرح سؤالك في مكان ما في منتدى Microsoft. لا يزال من الغريب أن يذكروا معلمات قيمة الجدول على صفحة CLR Sproc ولكن لا تشرح أبدًا كيفية تنفيذ ذلك. إذا وجدت أي حل ، أود أن أعرف.

نصائح أخرى

يمكنك استخدام جدول مؤقت تم إنشاؤه وملفقته قبل الاتصال بالإجراء وقراءة الجدول داخل إجراء CLR.

يتمثل الحل في تخصيص بياناتك الجدولية في سلسلة من تنسيق JSON ثم تمرير السلسلة إلى Proc CLR. داخل Proc أو وظيفة CLR ، يمكنك تحليل JSON إلى كائن غير قابل للتطبيق أو قائمة أو جدولة. يمكنك بعد ذلك العمل مع البيانات كما تفعل مع أي نوع آخر من البيانات الجدولية.

لقد كتبت بعض الأدوات المساعدة القادرة على تسلسل أي جدول SQL في سلسلة تنسيق JSON. سأكون سعيدًا بمشاركتهم مع أي شخص يقدم عنوان البريد الإلكتروني الخاص به. كتب Phil Factor محللًا لطيفًا T-SQL JSON الذي أطلق عليه اسم Parsejson. لقد قمت بتكييف حله لـ CLR الذي يؤدي بشكل أسرع بكثير. كلاهما يقبل سلسلة تنسيق JSON وإنتاج جدول من السلسلة. لديّ أيضًا مجموعة متنوعة من الأدوات المساعدة JSON التي أستخدمها مع كل من T-SQL و CLR قادرة على تسلسل ، وتوحل ، وإدخال ، وحذف ، وتحديث سلاسل تنسيق JSON المخزنة في أعمدة SQL.

إذا كنت تستخدم C# (على عكس VB ، الذي يفتقر إلى التكرارات المخصصة) ، يمكنك كتابة رمز ADO.NET لاستدعاء ExecuteNOnquery () وتشغيل إجراء مخزن مع أ sqldbtype.structuction المعلمة (أي ، tvp).

تم تمرير المجموعة كقيمة TVP التي يجب تنفيذها IEnumerable<SqlDataRecord>. في كل مرة هذه غير قابلة للتطبيق عودة العائد يتم تنفيذها ، أ sqldatarecord "الصف" مرتبط بمعلمة "الجدول".

نرى هذه المقالة للتفاصيل.

في حين يبدو أن تمرير الجداول مباشرة إلى إجراءات CLR مستحيل حاليًا ، فقد حصلت على نتيجة ، وإن كان ذلك الأمثل من:

  • تحديد جدول TSQL قيمة UDT
  • تحديد وظيفة TSQL التي تأخذ القدم كمعلمة وإرجاع XML باستخدام XML صريح
  • تمرير XML الناتج إلى وظيفة/الإجراء CLR بدلاً من الجدول نفسه

ليست مثالية ، لكنها تقترب قليلاً.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top