2

我正在尝试在 SQL 中使用 REPLACE 函数,但在尝试将字符串附加到列的当前内容的末尾时遇到问题。

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 '\'

编辑:实际上,我想通了,结果发现我只是愚蠢而忽略了一些小事。显然,这些字段充满了附加到字符串末尾的大量空白,因此附加到这些字段会导致打破大小限制。 感谢所有的帮助!

4

3 回答 3

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 (为什么?!)。Char 列有隐含的尾随空格,因此如果将 'ABC' 添加到包含 'XYZ' 的 char(10) 字段,它实际上最终会成为比 char(10) 长的 'XYZ ABC' (13)。

在第二种情况下,即 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 '\'
于 2012-09-27T20:40:39.493 回答
0

concat可能更有用吗?

就错误消息而言,我不知道为什么会生成它,但是自从我上次使用 MS SQL 以来已经有一段时间了。

于 2012-09-27T20:33:25.110 回答
0

我认为您的专栏可能会被递归聚合,无限循环。或至少广告 512 个字符。

如果是这种情况,您必须将当前表内容卸载到临时表中,然后使用该数据将更新执行回原始表。

我现在正在研究这是否可行。

于 2012-09-27T20:40:47.233 回答