2011-03-09 56 views
2

我有一个表格,我需要替换列中的某些值。使用SQL Server替换字符串替换函数 - 字符串有超过4000个字符 - 该怎么办?

的数据库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

理解的任何输入的。

+5

为什么'nvarchar(max)'在4000个字符时会导致截断?这会为你带来什么回报? 'SELECT LEN(REPLACE(CAST('A'as NVARCHAR(MAX)),16000),'A','B'))'你确定你的问题不仅仅是它在SSMS中被截断结果如何? – 2011-03-09 12:31:27

+0

因为'nvarchar'的最大值是4000:http://msdn.microsoft.com/zh-cn/library/ms186939.aspx。你给我的查询返回值16000,但我怎样才能让它迭代通过列来测试值?用柱子替换铸件中的'A'并不能解决问题。 – MadsMadsDk 2011-03-09 12:47:15

+0

@MadsMadsDk - No'4000'是最大的显式值。使用'max'可以保存高达2GB的数据(10亿个双字节字符) – 2011-03-09 12:50:00

回答

5

我怀疑你刚才打了极限在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] 
3

这说明了如何更换可以处理更长的字符串

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