CLR UDF يُرجع Varbinary(MAX)
-
20-08-2019 - |
سؤال
هل من الممكن لوظيفة 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
, ، فستحتاج إلى تجاوز الإعداد الافتراضي باستخدام إحدى الطرق التالية:
أنت تستطيع
ALTER
تعريف الوظيفة أو Proc بعد إنشائها بواسطة Visual Studio، وفي هذه الحالة يمكنك أيضًا تغيير أنواع البيانات (إما معلمات الإدخال أو قيم الإرجاع) لتكون بأي حجم مثلVARBINARY(100)
أوNVARCHAR(50)
.يمكنك استخدام ال
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 على النحو الموصى به أعلاه
.