【问题标题】:Replacing a string using SQL Server Replace function - string has more than 4000 characters - what to do?使用 SQL Server Replace 函数替换字符串 - 字符串超过 4000 个字符 - 怎么办?
【发布时间】:2011-07-11 20:53:05
【问题描述】:

我有一个表,我需要在其中替换列中的一些值。

数据库在 SQL Server 2005 上运行。

问题是某些行包含超过 4000 个字符,这给 REPLACE 函数带来了一些麻烦,因为它要求我将第一个参数转换为数据类型 NVARCHAR,因此任何超过 4000 个的字符, 正在被截断。

除了编写处理此问题的应用程序之外,是否有任何解决方法?

有问题的查询是:

SELECT 
   Replace(cast([Database].[dbo].[fruits].[Tekst] as NVARCHAR(MAX)), 'bananas', 'apples') 
FROM [Database].[dbo].[fruits]

fruits 列的数据类型为 Text

任何意见表示赞赏。

【问题讨论】:

  • 为什么nvarchar(max) 会在 4000 个字符处截断?这对你有什么回报? SELECT LEN(REPLACE(REPLICATE(CAST('A' AS NVARCHAR(MAX)),16000),'A','B'))您确定您的问题不仅仅是在 SSMS 结果中被截断了吗?
  • 因为nvarchar的最大值是4000:msdn.microsoft.com/en-us/library/ms186939.aspx。你给我的查询返回值 16000,但我怎样才能让它遍历一个列来测试值呢?用柱子替换演员表中的“A”并没有解决问题..
  • @MadsMadsDk - 否 4000 是最大显式值。使用max 最多可以容纳 2GB 的数据(十亿个双字节字符)
  • @madsmadsdk:NVARCHAR(MAX) 的最大值是 2 GByte 的数据量 - 大约是 Tolstoj 的 War and Peace 量的 250 倍 - 对你来说足够了!?!?? !
  • @marc_s:只是勉强够了 :)

标签: sql sql-server-2005 string replace


【解决方案1】:

我怀疑您刚刚达到了 SSMS 中单个值的限制。

令人讨厌的是,它不允许您将其设置为无限制,我知道显示长文本的唯一方法是通过转换为 XML,如下所示。

select
(select Replace(cast([Database].[dbo].[fruits].[Tekst] as NVARCHAR(MAX)),'bananas','apples')  AS [processing-instruction(x)] FOR XML PATH(''), TYPE)
FROM [Database].[dbo].[fruits]

【讨论】:

    【解决方案2】:

    这演示了 REPLACE 如何处理更长的字符串

    SELECT CAST(REPLICATE(N'abc', 4000) AS nvarchar(MAX)) +
                   REPLICATE(N'def', 4000)  +
                   REPLICATE(N'abc', 4000)
    
    SELECT LEN(
           CAST(REPLICATE(N'abc', 4000) AS nvarchar(MAX)) +
                   REPLICATE(N'def', 4000)  +
                   REPLICATE(N'abc', 4000)
           ) --11997
    
    SELECT REPLACE(CAST(REPLICATE(N'abc', 4000) AS nvarchar(MAX)) +
                   REPLICATE(N'def', 4000)  +
                   REPLICATE(N'abc', 4000), 'def', 'ddeeff')
    
    SELECT LEN(
           REPLACE(CAST(REPLICATE(N'abc', 4000) AS nvarchar(MAX)) +
                   REPLICATE(N'def', 4000)  +
                   REPLICATE(N'abc', 4000), 'def', 'ddeeff')
           ) --15996
    

    【讨论】:

      猜你喜欢
      • 2011-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多