المعرفة من قبل المستخدم الكلي في SQL Server 2008 - كيفية نشر مع MaxByteSize = -1?
-
05-07-2019 - |
سؤال
قرأت هنا (وفي أماكن أخرى) أنه من الممكن ، في SQL Server 2008 أو في بناء المعرفة من قبل المستخدم الإجمالية التي يمكن أن تعود سلسلة أطول من 8000 حرف.هذا هو بالضبط ما كنت بحاجة.
ويفترض أن طريقة تعيين maxByteSize إلى -1 بدلا من رقم 1 راجع للشغل و 8000;هذا يجب أن تسمح أي حجم ما يصل إلى 2GB.
لسبب ما, على ما يبدو, لا يمكنك نشر مباشرة من Visual Studio 2008 إذا كنت تستخدم هذا الإعداد ، لذلك تحتاج إلى يدويا نشر.
لذلك:بناء المشروع - GroupConcat (والتي من المفترض أن محاكاة الخلية group_concat مجمع) - الذي يعطي لي في المشروع بن مجلد ملف "SqlClassLibrary.dll".في التعليمات أعلاه ربط الصفحة ، بناء الجمعية في SQL Server.الأمر ينفذ بنجاح.ومع ذلك ، عندما أحاول في الواقع استخدام على groupconcat مجمع:
select department, dbo.groupconcat(projectNumber) from projectleads group by department
...يقول لا يمكن العثور عليها.كل هذا يعمل بشكل جيد إذا أنا وضعت maxByteSize إلى 8000 ونشر مباشرة من داخل VS2008 ، ولكن أحتاج >8000.هل يعلم أحد ما أفعله خطأ ؟
شكرا -دان
ملاحظة: أنا أعمل على وجه التحديد بحاجة إلى groupconcat مجمع وظيفة بدلا من استخدام بعض SQL Server الحيل رأيت في كثير من الأحيان.
المحلول 2
اكتشفت ذلك...بعد بناء الحل في مواجهة Studio, على افتراض كنت قد انخفض .dll أنه يخلق في c: emp ويطلق عليه GroupConcat.dll:
CREATE ASSEMBLY GroupConcat from 'C:\temp\GroupConcat.dll' with permission_set = safe
GO
CREATE AGGREGATE groupconcat(@input nvarchar(max))
RETURNS nvarchar(max)
EXTERNAL NAME GroupConcat
GO
أن يفعل ذلك.
نصائح أخرى
يمكنك بدلا من ذلك استخدام MaxSize
ملك SqlFacetAttribute
إلى أن تبين varchar الحجم.لاحظ أنه في المثال أدناه أنا طبقت هذه السمة إلى SqlString
المعلمات في Accumulate
طريقة إرجاع قيمة Terminate
الأسلوب.هذه النتائج في SQL التالية التوقيع:
AGGREGATE [dbo].[Concatenate] (@value nvarchar(max), @order int, @seperator nvarchar(max)) RETURNS nvarchar(max)
[Serializable]
[SqlUserDefinedAggregate(
Format.UserDefined,
IsInvariantToOrder = true,
IsInvariantToNulls = true,
IsInvariantToDuplicates = false,
IsNullIfEmpty = false,
MaxByteSize = -1)]
public struct Concatenate : IBinarySerialize
{
public void Init();
public void Accumulate([SqlFacet(MaxSize = -1)] SqlString value,
SqlInt32 order,
[SqlFacet(MaxSize = -1)] SqlString seperator);
public void Merge(Concatenate group);
[return: SqlFacet(MaxSize = -1)]
public SqlString Terminate();
public void Read(BinaryReader r);
public void Write(BinaryWriter w);
}
أنا لا أعرف إذا كان هذا هو المزيد من "الصحيح" من ما انتهى به, ولكن يبدو أكثر طبيعية.