将大量行连接成一个字符串

时间:2010-09-15 08:07:06

标签: sql sql-server-2008

我有一个包含大量行的表。每行有2列我需要使用 - 第一行是一些HTML格式,第二行是文本。我需要将所有这些行连接成一个字符串值,以便我可以通过电子邮件发送这个庞大的字符串。由于行数很多,我无法使用VARCHAR变量 - 我必须使用文本。当前的解决方案是使用游标读取所有行,然后插入具有text类型的单个列的临时表,然后简单地追加到该表中的单个行。

问题是字符串似乎在大约33000个字符后被切断。我完全不知道为什么会这样。

编辑:我从这里给出的答案中得到了一些建议,并将解决方案改为使用VARCHAR(MAX)。然而,我仍然得到了截止,但是以一种非常奇怪的方式。似乎变量没有溢出,它根本不会附加所有值。

DECLARE @Result VARCHAR(MAX)
SET @Result = ''

SELECT @Result = @Result + ltrim(isnull(format,'')) + '&nbsp;' + text + '<BR></TD></TR><TR><TD CLASS="GEN" align="left" BGCOLOR="#E9ECFD">' 
FROM SomeTable

真正奇数位是,如果我取出我在行尾添加所有html的位,一切正常。我甚至先将所有内容都插入到tmp表中然后选择了这个连接 - 仍然没有运气。 tmp表包含正确的值(包括html),但最终变量不包含。

3 个答案:

答案 0 :(得分:1)

  

由于我的行数很多   不能使用VARCHAR变量 - 我有   使用文字

从SQL Server 2005开始,支持VARCHAR(MAX)和NVARCHAR(MAX)来处理超过8000(NVARCHAR为4000)字符的大字符串,最高可达~2GB。因此,截至2005年,您应该考虑使用这些而不是TEXT / NTEXT,这将在SQL Server的未来版本中弃用。

这种对MAX的支持比处理TEXT更容易,所以给它一个旋转。

答案 1 :(得分:1)

修改:我认为主要问题是您使用varbinary(16)作为更新text值的指针。一个带符号的16位整数将在32,768左右耗尽 - 这可能是你的问题。

尝试使用bigint指针代替varbinary

另请注意,UPDATETEXT已被弃用,Microsoft建议您将UPDATEWRITE子句一起使用 - see here

来自this msdn页面的示例:

UPDATE Production.Document
SET DocumentSummary .WRITE (N'features',28,10)

同样,text即将开始,您应该使用varchar(max)代替。

答案 2 :(得分:-1)

您最好将连接的字符串写入文件。 要将字符串写入文件,您可以像这样使用SP: http://www.simple-talk.com/code/WorkingWithFiles/spWriteStringTofile.txt