TSQL:如何将单列的行加入/组合成 CSV 列表
Posted
技术标签:
【中文标题】TSQL:如何将单列的行加入/组合成 CSV 列表【英文标题】:TSQL: How to Join / Combine rows of a single column into a CSV list 【发布时间】:2015-01-02 10:47:46 【问题描述】:我有一个名为“colamer”的表,如下所示:
ID Title SectionID
1 abc 231
2 abc 232
3 pqr 95
4 jkl 165
我的存储过程:
CREATE PROCEDURE CheckDuplicateBannerforSection
/*
colamer_CheckDuplicateBannerforSection 'abc','231,232,233',NULL
*/
@BannerTitle NVARCHAR(200),
@SectionId VARCHAR(50),
@Result VARCHAR(100) OUT
AS
BEGIN
SET @Result = 1
BEGIN
IF EXISTS
(SELECT 1 FROM colamer WHERE Title= @BannerTitle
And SectionID in(SELECT value FROM dbo.colamer_fn_Split1( @SectionId ,',')))
END
SELECT @Result
结束
我想要输出: @结果 = 231,232
【问题讨论】:
函数dbo.colamer_fn_Split1
有什么作用?
省去回复的麻烦,我想通了。 :)
它拆分字符串,,,
@Pranav 在您的示例标题中,abc
只有一个 SectionID 231,那么您如何获取 231,231 作为输出。请澄清...
已编辑..检查..谢谢
【参考方案1】:
试试这个:
CREATE PROCEDURE CheckDuplicateBannerforSection
/*
Mercola_CheckDuplicateBannerforSection 'abc','231,232,233',NULL
*/
@BannerTitle NVARCHAR(200),
@SectionId VARCHAR(50),
@Result VARCHAR(100) OUT
AS
BEGIN
SELECT @Result = STUFF((SELECT ',' + CONVERT(VARCHAR(50), c.SectionID)
FROM colamer c
CROSS APPLY dbo.colamer_fn_Split1(@SectionId, ',') AS A
WHERE c.SectionID = A.value AND Title = @BannerTitle
FOR XML PATH('')
), 1, 1, ''
)
END
【讨论】:
为什么使用CROSS APPLY
?这不是必要的。原来的IN
列表很好,或者INNER JOIN
可以工作。
错误:将 varchar 值 ',' 转换为数据类型 int 时转换失败。
这会起作用,因为字符总是只有数字,但是如果你对文本数据使用这个xml path('')
方法,它可能会弄乱需要像&
这样的xml-entities 的字符。通过 stuff((select [...] for xml path(''), type).value('.', 'nvarchar(max)'), 1, 1, '')
解决这个问题(注意 , type 和 .value('.', 'nvarchar(max)'))
@saharsh: ***.com/questions/27936466/…【参考方案2】:
我猜你正在寻找这样的东西:
CREATE PROCEDURE CheckDuplicateBannerforSection
@BannerTitle NVARCHAR(200),
@SectionId VARCHAR(50),
@Result VARCHAR(100) OUT
AS
BEGIN
SET @Result = ''
Select @Result = @Result + ',' + Convert(nvarchar, SectionID)
from colamer where Title = @BannerTitle and SectionID in(SELECT value FROM dbo.colamer_fn_Split1( @SectionId ,','))
END
【讨论】:
是的,这是多余的,请参阅固定版本。【参考方案3】:CREATE PROCEDURE Mercola_CheckDuplicateBannerforSection
/*
Mercola_CheckDuplicateBannerforSection 'abc','231,232,233',NULL
*/
@BannerTitle NVARCHAR(200),
@SectionId VARCHAR(50),
@Result VARCHAR(100) OUT
AS
BEGIN
SET @Result = 1
BEGIN
IF EXISTS (SELECT 1 FROM colamer
WHERE Title = @BannerTitle
And SectionID
in(SELECT value FROM
dbo.colamer_fn_Split1( @SectionId ,',')))
BEGIN
SELECT top 1 @Result=SectionID FROM colamer
WHERE Title = @BannerTitle
And SectionID in(SELECT value FROM
dbo.colamer_fn_Split1( @SectionId ,','))
END
END
SELECT @Result
END
【讨论】:
输出应该是 231,232 ***.com/questions/27936466/…以上是关于TSQL:如何将单列的行加入/组合成 CSV 列表的主要内容,如果未能解决你的问题,请参考以下文章
如何通过使用 R 将每个文件的数据添加为附加行来将不同的 .csv 文件组合成一个完整的文件?