我有一个包含大量行的表。每行有2列我需要使用 - 第一行是一些HTML格式,第二行是文本。我需要将所有这些行连接成一个字符串值,以便我可以通过电子邮件发送这个庞大的字符串。由于行数很多,我无法使用VARCHAR变量 - 我必须使用文本。当前的解决方案是使用游标读取所有行,然后插入具有text类型的单个列的临时表,然后简单地追加到该表中的单个行。
问题是字符串似乎在大约33000个字符后被切断。我完全不知道为什么会这样。
编辑:我从这里给出的答案中得到了一些建议,并将解决方案改为使用VARCHAR(MAX)。然而,我仍然得到了截止,但是以一种非常奇怪的方式。似乎变量没有溢出,它根本不会附加所有值。DECLARE @Result VARCHAR(MAX)
SET @Result = ''
SELECT @Result = @Result + ltrim(isnull(format,'')) + ' ' + text + '<BR></TD></TR><TR><TD CLASS="GEN" align="left" BGCOLOR="#E9ECFD">'
FROM SomeTable
真正奇数位是,如果我取出我在行尾添加所有html的位,一切正常。我甚至先将所有内容都插入到tmp表中然后选择了这个连接 - 仍然没有运气。 tmp表包含正确的值(包括html),但最终变量不包含。
答案 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建议您将UPDATE
与WRITE
子句一起使用 - 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