【问题标题】:How to pass large search character in SQL Replace function如何在 SQL 替换函数中传递大搜索字符
【发布时间】:2019-03-24 21:32:09
【问题描述】:

这个问题有点源自另一个帖子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 不能为空字符串 (''),并且不得超过适合页面的最大字节数。

有什么建议吗?

【问题讨论】:

    标签: sql sql-server replace


    【解决方案1】:

    我的猜测是第二个字符串也需要演员表

    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       
           ;
    

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

    【讨论】:

    • 在第二个@target 再添加一个 + '1' 会爆炸,它可以容纳 8000 但不能容纳 8001。
    • 好吧,看来你搞砸了。但至少现在你有办法重现错误。也许有人有更好的主意。
    【解决方案2】:

    我想我们讨论过这个 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 拆分为 2 个或更多部分。

    这是一个模拟您的情况的 Demo

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-14
      • 2015-03-19
      • 2017-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多