المعرفة من قبل المستخدم الكلي في SQL Server 2008 - كيفية نشر مع MaxByteSize = -1?

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

سؤال

قرأت هنا (وفي أماكن أخرى) أنه من الممكن ، في 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);
}

أنا لا أعرف إذا كان هذا هو المزيد من "الصحيح" من ما انتهى به, ولكن يبدو أكثر طبيعية.

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