我们正在尝试用单个查询连接 SQL 中可能有数千行文本。我们当前的查询如下所示:
DECLARE @concatText NVARCHAR(MAX)
SET @concatText = ''
UPDATE TOP (SELECT MAX(PageNumber) + 1 FROM #OrderedPages) [#OrderedPages]
SET @concatText = @concatText + [ColumnText] + '
'
WHERE (RTRIM(LTRIM([ColumnText])) != '')
从功能的角度来看,这工作得很好。我们遇到的唯一问题是有时 ColumnText 可能有几千字节的长度。结果,当我们有数千个这样的行时,我们正在填满 tempDB。
我们想出的最好理由是,当我们对@concatText 进行这些更新时,SQL 正在使用隐式事务,因此字符串实际上是不可变的。
我们试图找出解决这个问题的好方法,到目前为止,我们有两种可能的解决方案:1)在.NET中进行连接。这是一个不错的选择,但是很多数据可能会通过网络返回。
2) 使用 .WRITE,其操作方式与 .NET 的 String.Join 方法类似。我无法弄清楚它的语法,因为 BoL 没有涵盖这一级别的 SQL 恶作剧。
这让我想到了一个问题:.WRITE 会起作用吗?如果是这样,语法是什么?如果没有,是否有任何其他方法可以在不向 .NET 发送数据的情况下执行此操作?我们不能使用FOR XML
,因为我们的文本可能包含非法的 XML 字符。
提前致谢。