此问题有点源于另一篇文章How to pass large string_replacement in SQL Replace function,但是在这种情况下,大字符位于搜索部分。
例如,
select REPLACE(CAST('CharactersOver10000' AS VARCHAR(MAX), 'CharactersOver8000', 'text' )
上面的select语句将引发错误
String or binary data would be truncated.
我从Replace documentation中学到了这一点,并怀疑可能是粗体部分,但并不确定是什么意思以及如何处理超过8000个字符的string_pattern。
string_pattern 是要找到的子字符串。 string_pattern可以是字符或二进制数据类型。 string_pattern不能为空字符串(''),并且不得超过页面上可以容纳的最大字节数。
有什么建议吗?
答案 0 :(得分:0)
我的猜测是第二个字符串也需要强制转换
select REPLACE(
CAST('CharactersOver10000' AS VARCHAR(MAX)),
CAST('CharactersOver8000' AS VARCHAR(MAX)),
'text' )
无论如何,我使用变量进行了测试,但未收到任何错误:
DECLARE @source VARCHAR(MAX) = '1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890'; ;
DECLARE @target VARCHAR(MAX);
SET @target = @source + @source + @source + @source + @source + @source + @source + @source + @source + @source;
SET @target = @target + @target + @target + @target + @target + @target + @target + @target;
SET @source = @source + @source + @source + @source + @source + @source + @source + @source + @source + @source;
SET @source = @source + @source + @source + @source + @source + @source + @source + @source + @source + @source;
SELECT len(@source) as source_size,
len(@target) as target_size
;
select REPLACE(CAST(@source as VARCHAR(MAX)), @target, 'text' );
select REPLACE(@source, @target, 'text' );
答案 1 :(得分:0)
我认为我们现在根据 earlier
讨论了这个 Docs Onlinevarchar [(n | max)]可变长度的字符串数据。 n定义字符串长度,并且可以是1到8,000之间的值。 max表示最大存储大小为2 ^ 31-1字节(2 GB)。
REPLACE ( string_expression , string_pattern , string_replacement )
因此,如果您拥有一个字符串数据>8000
,则应将其声明/广播为VARCHAR(MAX)/NVARCHAR(MAX)
,这适用于string_expression
,我在另一个问题中对此进行了回答,现在来看您的代码
SELECT REPLACE(
CAST('CharactersOver10000' AS VARCHAR(MAX),
'CharactersOver8000', --Here is your problem
'text'
);
string_pattern
必须为<string_expression
,并且必须为<= 8000
(不得超过页面上可容纳的最大字节数。如所述) ,如果它是> 8000
,则REPLACE()
函数将失败,并且您得到
字符串或二进制数据将被截断。
解决方案:
您可以考虑将string_pattern
分成两部分或更多部分。
这是模拟您情况的 Demo 。