我有一个表,其中有一NTEXT
列名为comments
. 我有第二个字符串,我们称它为anothercomment
(a varchar
),它需要放在comments
word 之后的给定字符串中UPDATEHERE
。
转换为nvarchar(max)
截断comments
字符串,所以我不能使用CHARINDEX()
(之类的Msg 8152, Level 16, State 10, Line 2
String or binary data would be truncated.)
。我曾经datalength()
检查过有几千列 > 8000 个字符。
我想要实现的一个示例(尽管字符串更长):
注释 -
This is a test UPDATEHERE This is the end of the test
另一条评论——
. This is inserted.
结果字符串 -
This is a test UPDATEHERE. This is inserted. This is the end of the test
我意识到这对于普通的varchar()
/来说是微不足道的nvarchar()
,但却ntext
是一个彻头彻尾的噩梦。我意识到这是一种已弃用的数据类型,但我没有编写有问题的应用程序。
从代码的角度来看,转换
nvarchar(max)
和返回ntext
确实让生活变得更简单,但这确实意味着转换和重写整个(可能非常大的)值,这意味着所有的 CPU 和日志记录开销。另一种方法是使用
UPDATETEXT
. 这已被弃用,就像 一样ntext
,但它可以显着减少日志记录开销。不利的一面是,这意味着使用文本指针,并且一次只能操作一行。以下示例代码使用游标来解决该限制,并使用
PATINDEX
而不是CHARINDEX
因为前者是直接使用的少数函数ntext
之一:样本数据
光标声明
处理循环
nvarchar(max)
除非你做错了什么,否则转换为应该工作CHARINDEX()
试试这个代码片段,它应该输出你想要的。
感谢Andriy M提供的帮助
REPLICATE
。