Agrégat défini par l'user dans SQL Server 2008 – Comment déployer avec MaxByteSize = -1?

Je lis ici (et ailleurs) qu'il est possible, dans SQL Server 2008, de build un agrégat défini par l'user qui peut renvoyer une string de plus de 8000 caractères. C'est exactement ce dont j'ai besoin.

Supposément, la méthode consiste à mettre maxByteSize à -1 au lieu d'un nombre btw 1 et 8000; ceci devrait permettre n'importe quelle taille jusqu'à 2GB.

Pour une raison quelconque, apparemment, vous ne pouvez pas déployer directement à partir de Visual Studio 2008 si vous utilisez ce paramètre; donc vous devez déployer manuellement.

Donc: Je construis mon projet – GroupConcat (qui est censé simuler l'agrégateur group_concat de MySQL) – ce qui me donne, dans le dossier bin du projet, un file "SqlClassLibrary.dll". Conformément aux instructions de la page ci-dessus liée, je crée l'assembly dans SQL Server. La command s'exécute avec succès. Cependant, lorsque j'essaie d' utiliser réellement l'agrégateur groupconcat:

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

… il dit qu'il ne peut pas être trouvé. Tout fonctionne correctement si je mets maxByteSize à 8000 et que je les déploie directement à partir de VS2008, mais j'ai besoin de> 8000. Quelqu'un sait ce que je fais mal?

Merci -dan

REMARQUE: je dois spécifiquement avoir une fonction d'agrégateur groupconcat plutôt que d'utiliser certaines des astuces SQL Server que j'ai souvent vues.

Alternativement, vous pouvez utiliser la propriété MaxSize de SqlFacetAtsortingbute à pour indiquer la taille de varchar. Notez que dans l'exemple ci-dessous j'ai appliqué cet atsortingbut aux parameters SqlSsortingng de la méthode Accumulate et à la valeur de return de la méthode Terminate . Cela entraîne la signature SQL suivante:

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)] SqlSsortingng value, SqlInt32 order, [SqlFacet(MaxSize = -1)] SqlSsortingng seperator); public void Merge(Concatenate group); [return: SqlFacet(MaxSize = -1)] public SqlSsortingng Terminate(); public void Read(BinaryReader r); public void Write(BinaryWriter w); } 

Je ne sais pas si c'est plus "correct" que ce que vous avez fini par faire, mais cela semble plus naturel.

Je l'ai compris … Après avoir construit la solution dans Vis Studio, en supposant que j'ai supprimé le file .dll, il crée dans c: \ temp et l'a appelé 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 

Ça le fait.