Frage

Ich lese hier (und anderswo), dass es möglich ist, in SQL Server 2008, um ein benutzerdefiniertes Aggregat zu bauen, die einen String länger als 8000 Zeichen zurückgeben können. Das ist genau das, was ich brauche.

Angeblich ist das Verfahren MaxByteSize zu setzen statt einer Nummer btw 1 und 8000 auf -1; Dies sollte jeder Größe bis zu 2 GB ermöglichen.

Aus irgendeinem Grund scheint, Sie nicht direkt aus Visual Studio 2008 bereitstellen können, wenn Sie diese Einstellung verwenden; so müssen Sie manuell bereitstellen.

Also: Ich baue mein Projekt - GroupConcat (die Group_concat Aggregator von MySQL simulieren sollte) -, die mir gibt, in dem Bin-Ordner des Projektes, eine Datei „SqlClassLibrary.dll“. Gemäß den Anweisungen auf der oben verlinkten Seite, baue ich die Assembly in SQL Server. Der Befehl erfolgreich ausgeführt. Allerdings, wenn ich versuche tatsächlich auf verwenden die groupconcat Aggregator:

select department, dbo.groupconcat(projectNumber) from projectleads group by department

... es sagt, es kann nicht gefunden werden. Das alles funktioniert gut, wenn ich MaxByteSize bis 8000 und bereitstellen direkt aus VS2008 gesetzt, aber ich brauche> 8000. Jeder weiß, was ich falsch mache?

Danke -dan

Hinweis: Ich brauche speziell eher eine groupconcat Aggregator-Funktion haben, als einige der SQL Server Tricks Ich habe oft gesehen,

.
War es hilfreich?

Lösung 2

figured it out ... Nachdem die Lösung in Vis Studio bauen, vorausgesetzt, ich die DLL es in c erstellt fallen gelassen habe: \ temp und nannte es 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

Das tut es.

Andere Tipps

Alternativ können Sie MaxSize Eigenschaft SqlFacetAttribute verwenden, um die varchar Größe anzuzeigen. Beachten Sie, dass in dem folgenden Beispiel I dieses Attribut auf den SqlString Parameter im Accumulate Verfahren und der Rückgabewert der Terminate Methode angewendet. Daraus ergibt sich die folgende SQL-Signatur:

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);
}

Ich weiß nicht, ob dies mehr ist „richtig“ als das, was Sie tun, am Ende, aber es scheint natürlicher.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top