如何在SQL Replace函数中传递较大的搜索字符

时间:2018-10-20 01:37:43

标签: sql sql-server replace

此问题有点源于另一篇文章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不能为空字符串(''),并且不得超过页面上可以容纳的最大字节数。

有什么建议吗?

2 个答案:

答案 0 :(得分:0)

我的猜测是第二个字符串也需要强制转换

select REPLACE(
               CAST('CharactersOver10000' AS VARCHAR(MAX)),
               CAST('CharactersOver8000' AS VARCHAR(MAX)), 
              'text' )

无论如何,我使用变量进行了测试,但未收到任何错误:

SQL DEMO

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       
       ;

enter image description here

select REPLACE(CAST(@source as VARCHAR(MAX)), @target, 'text' );      

select REPLACE(@source, @target, 'text' );

答案 1 :(得分:0)

我认为我们现在根据 earlier

讨论了这个 Docs Online
  

varchar [(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