Boucler les résultats de la procédure stockée pour créer une string

J'ai une procédure stockée qui returnne deux colonnes comme ceci;

entrez la description de l'image ici

Je veux savoir s'il est possible pour moi de créer une string délimitée par des virgules à partir de la colonne iTypeID du jeu de résultats. Je ne suis pas sûr de savoir comment parcourir ce jeu de résultats pour créer la string, je voudrais que la string se termine comme

@sqlSsortingng = '1,2,4,11,14' 

en tant que valeur de mon paramètre. L'appel de procédure stockée qui produit la table ci-dessus est;

 exec cfn_PlanningGoalGetType 0,'xmlSsortingng' 

Je ne sais pas si cela aide ou est assez clair mais n'importe quelle direction serait appréciée.

Vous pouvez utiliser COALESCE

 DECLARE @Str varchar(100) SELECT @Str = COALESCE(@Str + ', ', '') + CAST(iTypeID AS varchar(5)) FROM TableName Select @Str 

Cela pourrait créer une variable de table pour insert des données de sproc, puis sélectionner la sortie dans une string de ligne.

 DECLARE TABLE @tmpBus ( iTypeId INT, Desc INT ) INSERT INTO @tmpBus EXEC cfn_PlanningGoalGetType 0,'xmlSsortingng' DECLARE @CodeNameSsortingng varchar(100) SELECT @CodeNameSsortingng = STUFF( (SELECT ',' + iTypeID FROM @tmpBus ORDER BY Sort FOR XML PATH('')), 1, 1, '') 

Voici deux options différentes pour votre cas d'utilisation réel que j'irais avec Coalesce ou ma version sans:

 CREATE TABLE [dbo].[Test]( [Id] [int] NOT NULL ) ON [PRIMARY] GO INSERT INTO Test (Id) VALUES (1),(4),(7),(15) declare @val nvarchar(max) set @val='' select @val=@val +',' + cast(id as nvarchar) from test select subssortingng(@val,2,len(@vaL)) 

Une autre option consiste à créer un agrégateur, utile si vous agrégez vos résultats, ou si vous souhaitez renvoyer une colonne délimitée dans un set de résultats. J'ai dû faire ceci quand je veux renvoyer une relation 1> N mais pour la pagination dans une IU nous voulons renvoyer seulement un petit sous-set des données. Imaginons que nous voulons renvoyer 10 contacts et les balises personnalisées qu'un user a définies sur chaque contact …

 [Serializable] [SqlUserDefinedAggregate(Format.UserDefined, MaxByteSize = 8000)] public struct SsortingngConcat : IBinarySerialize { private System.Collections.Generic.List<ssortingng> values; public void Init() { this.values = new System.Collections.Generic.List<ssortingng>(); } public void Accumulate(SqlSsortingng value) { if (!value.IsNull) { this.values.Add(value.Value); } } public void Merge(SsortingngConcat value) { this.values.AddRange(value.values.ToArray()); } public SqlSsortingng Terminate() { return new SqlSsortingng(ssortingng.Join(", ", this.values.ToArray())); } public void Read(BinaryReader r) { int itemCount = r.ReadInt32(); this.values = new System.Collections.Generic.List<ssortingng>(itemCount); for (int i = 0; i <= itemCount - 1; i++) { this.values.Add(r.ReadSsortingng()); } } public void Write(BinaryWriter w) { w.Write(this.values.Count); foreach (ssortingng s in this.values) { w.Write(s); } } } 

Vous exécuteriez alors ceci comme:

 select dbo.ssortingngcontact(id),someotherfield from mytable group by someotherfield