Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 不使用FOR XML将多行连接到单个行/列的查询-使用FOR XML编辑_Sql_Tsql - Fatal编程技术网

Sql 不使用FOR XML将多行连接到单个行/列的查询-使用FOR XML编辑

Sql 不使用FOR XML将多行连接到单个行/列的查询-使用FOR XML编辑,sql,tsql,Sql,Tsql,我有一个相当复杂的问题,我正试图把它放在一起。我有两个表,tblSMS和TBLSMSENT,其中包含通过API发送和接收的SMS消息的数据。我需要编写一个查询,该查询将给出发送的每条消息以及该消息的每条响应。我已经尝试使用LiNQ来实现这一点,但是我的第二个查询接收每个已发送消息的消息时没有返回任何结果 以下是检索已发送的每条消息的初始查询: var query = "Select top({0}) * from (" + " SELECT DISTINCT ROW_NUMBER() OVE

我有一个相当复杂的问题,我正试图把它放在一起。我有两个表,tblSMS和TBLSMSENT,其中包含通过API发送和接收的SMS消息的数据。我需要编写一个查询,该查询将给出发送的每条消息以及该消息的每条响应。我已经尝试使用LiNQ来实现这一点,但是我的第二个查询接收每个已发送消息的消息时没有返回任何结果

以下是检索已发送的每条消息的初始查询:

var query = "Select top({0}) * from (" +
"   SELECT DISTINCT ROW_NUMBER() OVER(ORDER BY[date] desc) " +
"   AS RowNum, RTRIM(phone) as phone, [date], " +
"   RTRIM(LEFT(result,50)) as result, RTRIM(debtor) as debtor, " +
"   RTRIM(sms) as OrigBody, RTRIM([user]) as [user], " +
"   RTRIM(MessageId) as MessageId FROM tblSMSSent " +
"   where RTRIM([user]) = '{2}' " +
") AS tbl WHERE tbl.RowNum > {1} "
此查询正确返回数据。 当我使用联接运行查询时,例如

Select top{0} * from ( 
    SELECT DISTINCT ROW_NUMBER() OVER(ORDER BY[date] desc)  
    AS RowNum, RTRIM(phone) as phone, [date],  
RTRIM(LEFT(result,50)) as result, RTRIM(debtor) as debtor,  
    RTRIM(sms) as OrigBody, MessageBody, RTRIM([user]) as [user],  
    RTRIM(MessageId) as MessageId FROM tblSMSSent  
    right join tblSMS on messageId=outgoingmessageId
    where RTRIM([user]) = '{2}'  
) AS tbl WHERE tbl.RowNum > {1}
它为对应于该MessageId的每个MessageBody返回多行。我需要的是MessageBody将来自tblSMS的每条消息包含在一行中,并以某种方式进行分隔

这是我得到的一些样本数据:

这是我需要的数据:

如前所述,我曾尝试使用LiNQ实现这一点,但没有成功,但这不是我想要采用的方法,如果可能的话,我更愿意将其保存在单个查询中。由于我使用的是较旧版本的SQL server,因此不能使用诸如For XMLFOR之类的命令来帮助进行数据操作

由于我希望完成此操作,所以我将此响应数据发送回客户端,以HTML格式显示。如何在连接的结果之间设置换行符

我有什么选择


谢谢。好的。我从中找到了解决办法

我所做的是添加到另一个子查询中。经过一些研究,我发现我可以使用XML,但一些高级XML函数不可用

这是我的最后一个问题:

Select  * from ( 
    SELECT DISTINCT ROW_NUMBER() OVER(ORDER BY[date] desc)  
    AS RowNum, RTRIM(phone) as phone, [date],  
    RTRIM(LEFT(result,50)) as result, RTRIM(debtor) as debtor,  
    RTRIM(sms) as OrigBody,  RTRIM([user]) as [user],  
    RTRIM(MessageId) as MessageId ,
    (SELECT STUFF((SELECT '^' + MessageBody
            FROM tblSMS 
            WHERE outgoingMessageId=MessageId
            FOR XML PATH('')) ,1,1,'')) AS MessageText

    FROM tblSMSSent  
    where RTRIM([user]) = 'userName'  and MessageId<>0
) AS tbl WHERE tbl.RowNum > 0

这将提供由“^”分隔的所需结果集,尽管我可以更改分隔符

FORXML是在SQLServer2005中引入的,我正在使用它。我知道这是2010年的一项创新,但当我在另一个查询上尝试它时,我使用了我的服务器不理解的其他功能


谢谢您在这方面的帮助。

好的。我从中找到了解决办法

我所做的是添加到另一个子查询中。经过一些研究,我发现我可以使用XML,但一些高级XML函数不可用

这是我的最后一个问题:

Select  * from ( 
    SELECT DISTINCT ROW_NUMBER() OVER(ORDER BY[date] desc)  
    AS RowNum, RTRIM(phone) as phone, [date],  
    RTRIM(LEFT(result,50)) as result, RTRIM(debtor) as debtor,  
    RTRIM(sms) as OrigBody,  RTRIM([user]) as [user],  
    RTRIM(MessageId) as MessageId ,
    (SELECT STUFF((SELECT '^' + MessageBody
            FROM tblSMS 
            WHERE outgoingMessageId=MessageId
            FOR XML PATH('')) ,1,1,'')) AS MessageText

    FROM tblSMSSent  
    where RTRIM([user]) = 'userName'  and MessageId<>0
) AS tbl WHERE tbl.RowNum > 0

这将提供由“^”分隔的所需结果集,尽管我可以更改分隔符

FORXML是在SQLServer2005中引入的,我正在使用它。我知道这是2010年的一项创新,但当我在另一个查询上尝试它时,我使用了我的服务器不理解的其他功能


感谢您在这方面的帮助。

请发布示例数据和预期结果集。请查看图片请查看我的SQL server版本不支持for XML函数。正如我在问题中提到的,这是一个较旧版本的SQL Server,这就是我在这里发布这个问题的原因。@Geoff我想我可以为您提供一个解决方案,您能为这两个表提供一个模式吗?请发布示例数据和预期结果集。请查看图像请检查我的SQL server版本不支持for XML函数。正如我在问题中提到的,这是一个较旧版本的SQL Server,这就是为什么我在这里发布这个问题。@Geoff我想我可以为您提供一个解决方案,您能为这两个表提供一个模式吗?