将多个SQL行选择为一行
可能重复:将多个SQL行选择为一行,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,可能重复: 假设我有一个名为tblContractMail的表。数据示例表如下所示: 我需要编写生成以下输出的SQL查询: "abc@akij.net;efg@akij.net;hjk@akij.net" 我知道两种可能性: DECLARE @str varchar(4000) SELECT @str = COALESCE(@str + ';', '') + strContract FROM tblContractMail SELECT @str 以及: 有没有办法在单个查询中获得此输出
假设我有一个名为
tblContractMail
的表。数据示例表如下所示:
我需要编写生成以下输出的SQL查询:
"abc@akij.net;efg@akij.net;hjk@akij.net"
我知道两种可能性:
DECLARE @str varchar(4000)
SELECT @str = COALESCE(@str + ';', '') + strContract FROM tblContractMail
SELECT @str
以及:
有没有办法在单个查询中获得此输出(我的意思是不声明任何变量)?第一个方法依赖于变量,因此第一个方法的答案是否定的 但是,您可以轻松地使用第二种方法,无需变量,只需稍微修改:
SELECT
SUBSTRING(
(SELECT ';' + strContract FROM tblContractMail FOR XML PATH('')),
2,
2147483647
)
如您所见,分隔符位于项目之前。因此,您将开始从第二个字符中剪切字符串,忽略前导分号。长度说明符不必精确地为长度减1,您可以指定任何相当大的数字,函数将返回从第二个字符到结尾的所有内容。在这种情况下,已指定最大
int
值。请参阅此。是的,这个问题被重复了无数次。@PeterMajeed:是的,尽管从来没有人以这种特殊的形式问过它。@AndriyM:是的,谢谢分享-我从来都不知道你的答案是这样的。
SELECT
SUBSTRING(
(SELECT ';' + strContract FROM tblContractMail FOR XML PATH('')),
2,
2147483647
)