Sql server SQL Server版本的MySQL';s组_concat和转义字符串

Sql server SQL Server版本的MySQL';s组_concat和转义字符串,sql-server,tsql,sql-server-2008-express,Sql Server,Tsql,Sql Server 2008 Express,我只有MS SQL Server 2008和Visual Studio的快速版本。鉴于我无法创建SQL Server项目,因此CLR解决方案是不可能的,我尝试使用 select col1, stuff( ( select ' ' + col2 from StrConcat t1 where t2.col1 = t1.col1 for xml path('') ),1,1,'') from StrConcat t2 group by col1 order by col1 以获取一行连接的col2

我只有MS SQL Server 2008和Visual Studio的快速版本。鉴于我无法创建SQL Server项目,因此CLR解决方案是不可能的,我尝试使用

select col1, stuff( ( select ' ' + col2
from StrConcat t1
where t2.col1 = t1.col1
for xml path('')
),1,1,'')
from StrConcat t2
group by col1
order by col1
以获取一行连接的col2。col2是一个varchar字段,包含一些控制字符,如&和\n。当它与上面的SQL连接在一起时,它似乎转义了那些控制字符,即&变为 &;然后\n变成&#xOD,这不是我想要它做的。考虑到col1和concatenated字段将被用于更新另一个表,那么让concatenated字段保持其未转换的原始形式的最佳方法是什么?或者没有,唯一的方法是使用外部代码

表架构如下所示: StrConcat(id int主键,col1 int,txt varchar(80))
col1上有一个索引,txt应该按col1分组,按组内的id排序

当然,这种行为是。如果不以这种方式转义,查询可能会输出无效的XML

如果您需要在SQL Server中获取一个未经scape的值,那么您必须使用其中一个(递归CTE通常是CLR聚合和XML的
之后第二个最有效的,但最难编写)


当然,如果将其直接传递给应用程序,则在那里取消对其进行scape将容易得多,即使用.NET中的类。

行为当然是。如果不以这种方式转义,查询可能会输出无效的XML

如果您需要在SQL Server中获取一个未经scape的值,那么您必须使用其中一个(递归CTE通常是CLR聚合和XML的
之后第二个最有效的,但最难编写)


当然,如果这是直接传递给应用程序的,那么在那里取消它的scape就容易多了,即使用.NET中的类。

xml的
部分将xml转义添加到您的响应中,这是使用此方法的一个缺点。我不确定忽略那个问题是否容易。说得好。因此,我想真正的问题是,有什么更好的解决方案可以实现同样的效果而不产生负面影响。您可以尝试使用逗号,然后使用REPLACE函数将逗号替换为您实际需要的标记。
for xml
部分将xml转义添加到您的响应中,这是使用此方法的负面影响之一。我不确定忽略那个问题是否容易。说得好。因此,我想真正的问题是,有什么更好的解决方案可以实现同样的效果而不会带来负面影响。您可以尝试使用逗号,然后使用REPLACE函数将逗号替换为您实际需要的标记。有趣的是,我尝试了递归CTE,这需要48分钟的时间,并且正在运行。因此,在SQL Server中,除了使用代码之外,似乎没有什么简单的方法可以做到这一点。@TheObserver:Yikes。您要连接多少行?数据索引是否正确?另一个可能更快的方法是
UPDATE
技巧,但如果您想对其排序,则必须首先选择一个临时表/表变量。160万条记录,每个col1值要连接的行数可变。col1上有一个索引。要连接的字段确实需要按照表的主键排序。更新技巧是什么?@TheObserver:索引需要覆盖输出列才能有效。确保包含要连接的列。至于更新技巧,这是他们在我发布的第二个链接(“带T-SQL更新扩展名的标量UDF”)末尾告诉您不要做的事情。从理论上讲,微软有可能在SQL server的未来版本中更改实现并打破这一点,但这已经10年没有发生过了,所以你可能是安全的……有趣的是,我确实尝试过递归CTE,它需要48分钟的时间才能运行。因此,在SQL Server中,除了使用代码之外,似乎没有什么简单的方法可以做到这一点。@TheObserver:Yikes。您要连接多少行?数据索引是否正确?另一个可能更快的方法是
UPDATE
技巧,但如果您想对其排序,则必须首先选择一个临时表/表变量。160万条记录,每个col1值要连接的行数可变。col1上有一个索引。要连接的字段确实需要按照表的主键排序。更新技巧是什么?@TheObserver:索引需要覆盖输出列才能有效。确保包含要连接的列。至于更新技巧,这是他们在我发布的第二个链接(“带T-SQL更新扩展名的标量UDF”)末尾告诉您不要做的事情。从理论上讲,微软有可能在SQL server的未来版本中更改实现并打破这一点,但这已经10年没有发生过了,所以您可能是安全的。。。