2011-03-09 93 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