2012-09-27 67 views
2

我試圖在SQL中使用REPLACE函數,並且遇到了嘗試將字符串附加到列的當前內容末尾的問題。正則表達式在SQL(Microsoft SQL Server 2008 R2)中的字符串追加

set ActualRegex = REPLACE(ActualRegex, ActualRegex, ActualRegex + '[\d\D]*') 

這些字符串將用於在C#程序中的正則表達式的檢查,但是這並不是問題尤其重要。

當我嘗試運行此查詢,我最終得到一個錯誤信息

Msg 8152, Level 16, State 14, Line 1 
String or binary data would be truncated. 
The statement has been terminated. 

我檢查這些字段大小,並將得到的字符串幾乎不會長得超出了字段的大小(VARCHAR(512))。最大的可能是50個字符,除非有什麼奇怪的事情發生,我不知道。

在此先感謝您的幫助!

編輯:下面是完整的查詢

update [Registration].[dbo].[MigrationOfTagTypes] set ActualRegex = 
REPLACE(ActualRegex, ActualRegex, ActualRegex + '[\d\D]*') 
where Regex != '' and Regex like '%\%' escape '\' 

編輯:其實,我理解了它和原來我只是愚蠢和忽視的東西少。很明顯,這些字段中充滿了大量空字符串附加到字符串末尾,所以附加到這將導致破壞大小限制。 感謝您的幫助!

+1

Microsoft SQL Server 2008 R2 – user1704498

+0

這是UPDATE語句的一部分嗎? –

+0

是的,整個陳述是:update [Registration]。[dbo]。[MigrationOfTagTypes] set ActualRegex = REPLACE(ActualRegex,ActualRegex,ActualRegex +'[\ d \ D] *') 其中Regex!=''和正則表達式像'%\%'轉義'\' – user1704498

回答

2
Msg 8152, Level 16, State 14, Line 1 
String or binary data would be truncated. 
The statement has been terminated. 

有兩個原因:

  1. 你VARCHAR列不夠大。將7個字符添加到現有的10到varchar(15)列中將不起作用
  2. 您的列被定義爲char(爲什麼?!)。字符列有隱含的尾隨空格,所以如果將'ABC'添加到包含'XYZ'的char(10)字段,它實際上最終爲'XYZ ABC'(13),它比char(10)更長。

在第二種情況,即CHAR列,使用RTRIM

update [Registration].[dbo].[MigrationOfTagTypes] set ActualRegex = 
RTRIM(REPLACE(ActualRegex, ActualRegex, ActualRegex + '[\d\D]*')) 
where Regex != '' and Regex like '%\%' escape '\' 

注意:使用替代這樣可以讓'ABCxxxABC'成爲'ABC[\d\D]*xxxABC[\d\D]*'

如果你只是想append to the end of the column,那麼你可以使用

update [Registration].[dbo].[MigrationOfTagTypes] 
set ActualRegex = RTRIM(ActualRegex) + '[\d\D]*' 
where Regex != '' and Regex like '%\%' escape '\' 
+0

「最大的可能是50個字符,除非有什麼奇怪的事情發生,我不知道。」我認爲你仍然是正確的。 –

+0

謝謝,這完美地回答了! – user1704498

0

是否有可能concat更有用?

就錯誤信息而言,我不知道它爲什麼會生成,但是再次說明,自從我上次使用MS SQL以來已經有一段時間了。

0

我在想你的專欄可能存在遞歸地聚合,無限地增加。或至少廣告512個字符。

如果是這種情況,則必須將當前表內容卸載到臨時表中,然後使用該數據將更新執行回原始表。

我在研究現在是否有可能。

+0

這聽起來很有趣。奇怪的是,這聽起來像是最可能發生的問題。 – user1704498

+0

你可以將列更改爲VARCHAR(MAX)並嘗試它嗎?否則,請嘗試臨時表的想法。 –

相關問題