سؤال

هل من الممكن لوظيفة SQL CLR المعرفة من قبل المستخدم إرجاع نوع البيانات varbinary(MAX)؟

ويذكر في الوثائق:

"يمكن أن تكون معلمات الإدخال والنوع الذي تم إرجاعه من دالة القيمة العددية أيًا من أنواع البيانات العددية التي يدعمها SQL Server ، باستثناء ROWVERVENT ، نص ، ntext ، الصورة ، الطابع الزمني ، الجدول ، أو المؤشر." - لا يذكرون Varbinary ، لكنني لست متأكدًا ...

لدي بعض بيانات صفيف البايت من جانب .NET والتي أحتاج إلى إعادتها إلى SQL Server من CLR، وأحاول تجنب الاضطرار إلى القيام بذلك باستخدام معلمة إخراج من إجراء مخزن (هذه هي الطريقة التي حصلت عليها العمل في الاختبار الآن).

شكرًا!

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

المحلول

إذا قمت بتعريفه على أنه إرجاع أ SQLBytes نوع البيانات، يجب تعيين هذا بشكل صحيح varbinary(MAX) في خادم SQL.

[SqlFunction]
public static SqlBytes Function1()
{
    return new SqlBytes(Encoding.UTF8.GetBytes("Hello world."));
}

بينما يمكنك أيضًا استخدام SQLBinary نوع البيانات، إذا قمت بالنشر عبر Visual Studio، فسيتم تعيينه عليه varbinary(8000) بدلا من varbinary(MAX).

نصائح أخرى

من الناحية الفنية، لا يوجد حد أقصى يبلغ 8000 بايت في الواجهة من SQL Server إلى رمز CLR.إنه اختلاف أساسي في كيفية تعريف مجمّع T-SQL Stored Proc أو Function.بمعنى، إذا كانت وظيفة T-SQL Proc أو الوظيفة التي تستدعي رمز CLR تحدد ملف RETURNS مثل VARBINARY(MAX), ، فيكون VARBINARY(MAX), ، سواء حددت ذلك أم لا SqlBytes أو SqlBinary كنوع الإرجاع لرمز CLR.

كلاهما SqlBytes و SqlBinary يمكنه التعامل مع الحد الأقصى البالغ 2 جيجابايت، ولكن الاختلاف يكمن في كيفية قبول رمز CLR للبيانات. SqlBinary (تماما مثل SqlString) يأخذ قيمة المعلمة دفعة واحدة SqlBytes (تماما مثل SqlChars) يوفر واجهة دفق لذلك قد يكون أكثر كفاءة للقيم الكبيرة جدًا.

بالعودة إلى المشكلة التي تراها مع غلاف دالة SQL المحددة مسبقًا، فإن ذلك يكون كانت مسألة كيفية إنشاء Visual Studio (من الناحية الفنية SSDT) ​​تلقائيًاسد-T-SQL.الافتراضي ل SqlBinary يكون كان VARBINARY(8000) بينما الافتراضي ل SqlBytes يكون كان VARBINARY(MAX).وبنفس الطريقة، الافتراضي ل SqlString يكون كان NVARCHAR(4000) بينما الافتراضي ل SqlChars يكون كان NVARCHAR(MAX).أولئك كان الإعدادات الافتراضية عندما تم طرح هذا السؤال.بدءًا من Visual Studio 2012، تم تغيير الإعداد الافتراضي للاستخدام MAX لجميع أنواع البيانات الأربعة هذه.هذا ليس بالضرورة أمرًا جيدًا نظرًا لوجود أداء واضح لاستخدام MAX أنواع مقابل غيرMAX أنواع.لذلك، إذا كنت لا تحتاج إلى أكثر من 8000 بايت من VARBINARY أو 4000 بايت NVARCHAR, ، فستحتاج إلى تجاوز الإعداد الافتراضي باستخدام إحدى الطرق التالية:

  1. أنت تستطيع ALTER تعريف الوظيفة أو Proc بعد إنشائها بواسطة Visual Studio، وفي هذه الحالة يمكنك أيضًا تغيير أنواع البيانات (إما معلمات الإدخال أو قيم الإرجاع) لتكون بأي حجم مثل VARBINARY(100) أو NVARCHAR(50).

  2. يمكنك استخدام ال SqlFacet مصمم الديكور لإخبار Visual Studio / SSDT بإنشاء تعريفات الوظيفة أو Proc تلقائيًا باستخدام خيار الحجم الذي تفضله بدلاً من الخيار الافتراضي.يوضح المثال التالي تحديد الحجم لكل من معلمات الإدخال وقيمة الإرجاع (لاحظ أنه -1 = MAX):

    [return: SqlFacet(MaxSize = -1)]  
    [Microsoft.SqlServer.Server.SqlFunction(Name = "FunctionName")]  
    public static SqlBinary FuncName([SqlFacet(MaxSize = 50)] SqlString InputParam)
    

باستخدام أي من هاتين الطريقتين يمكنك القيام بأي منهما SqlBinary أو SqlBytes خريطة لأي منهما VARBINARY(1 - 8000) أو VARBINARY(MAX).وبالمثل، يمكنك القيام بأي منهما SqlString أو SqlChars خريطة لأي منهما NVARCHAR(1 - 4000) أو NVARCHAR(MAX).

ويبدو أن الجواب هو نعم - يمكنك استخدام كل من ثنائي متغير (MAX) من خلال العودة "SqlBinary" أو يمكنك استخدام SqlBytes على النحو الموصى به أعلاه

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