2012-09-27 64 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)并尝试它吗?否则,请尝试临时表的想法。 –

相关问题