循环遍历存储过程结果以创建字符串

时间:2014-07-24 15:56:28

标签: sql sql-server stored-procedures

我有一个存储过程,返回两个这样的列;

enter image description here

我想知道我是否可以从结果集的iTypeID列创建逗号分隔的字符串。我只是不确定如何遍历该结果集来创建字符串,我希望字符串最终结束为

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

作为我的参数值。生成上表的存储过程调用是;

exec cfn_PlanningGoalGetType 0,'xmlString'

不知道这有用还是足够清楚,但任何方向都会受到赞赏。

3 个答案:

答案 0 :(得分:2)

这可以创建表变量以从sproc插入数据,然后选择输出到一个行字符串。

DECLARE TABLE @tmpBus
(
   iTypeId INT,
   Desc INT
)

INSERT INTO @tmpBus
EXEC cfn_PlanningGoalGetType 0,'xmlString'

DECLARE @CodeNameString varchar(100)

SELECT 
   @CodeNameString = STUFF( (SELECT ',' + iTypeID
                             FROM @tmpBus
                             ORDER BY Sort
                             FOR XML PATH('')), 
                            1, 1, '')

答案 1 :(得分:2)

您可以使用COALESCE

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

Select @Str

答案 2 :(得分:0)

以下是您实际使用案例的两个不同选项我将使用Coalesce或我的版本:

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 substring(@val,2,len(@vaL))

另一种选择是构建聚合器,如果聚合结果,或者想要在结果集中返回分隔列,则该聚合器很有用。当我想要返回1> N关系时,我必须这样做,但是对于UI中的分页,我们只想返回一小部分数据。想象一下,我们想要返回10个联系人以及用户在每个联系人上定义的自定义标签......

[Serializable]
[SqlUserDefinedAggregate(Format.UserDefined, MaxByteSize = 8000)]
public struct StringConcat : IBinarySerialize
{
    private System.Collections.Generic.List<string> values;

    public void Init()
    {
        this.values = new System.Collections.Generic.List<string>();
    }

    public void Accumulate(SqlString value)
    {
        if (!value.IsNull)
        {
            this.values.Add(value.Value);
        }
    }

    public void Merge(StringConcat value)
    {

        this.values.AddRange(value.values.ToArray());
    }

    public SqlString Terminate()
    {
        return new SqlString(string.Join(", ", this.values.ToArray()));
    }

    public void Read(BinaryReader r)
    {
        int itemCount = r.ReadInt32();
        this.values = new System.Collections.Generic.List<string>(itemCount);
        for (int i = 0; i <= itemCount - 1; i++)
        {
            this.values.Add(r.ReadString());
        }
    }

    public void Write(BinaryWriter w)
    {
        w.Write(this.values.Count);
        foreach (string s in this.values)
        {
            w.Write(s);
        }
    }
}

然后您将其运行为:

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