我有一个存储过程,返回两个这样的列;
我想知道我是否可以从结果集的iTypeID列创建逗号分隔的字符串。我只是不确定如何遍历该结果集来创建字符串,我希望字符串最终结束为
@sqlString = '1,2,4,11,14'
作为我的参数值。生成上表的存储过程调用是;
exec cfn_PlanningGoalGetType 0,'xmlString'
不知道这有用还是足够清楚,但任何方向都会受到赞赏。
答案 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