【问题标题】:String appending of Regex in SQL (Microsoft SQL Server 2008 R2)SQL 中正则表达式的字符串附加 (Microsoft SQL Server 2008 R2)
【发布时间】:2012-09-19 16:57:38
【问题描述】:

我正在尝试在 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 '\'

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

【问题讨论】:

  • 这是 UPDATE 语句的一部分吗?
  • 是的,整个语句是:update [Registration].[dbo].[MigrationOfTagTypes] set ActualRegex = REPLACE(ActualRegex, ActualRegex, ActualRegex + '[\d\D]*') where Regex != '' 和 Regex 之类的 '%\%' 转义 '\'

标签: sql regex string replace sql-server-2008-r2


【解决方案1】:
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 '\'

【讨论】:

  • "它们最多可能有 50 个字符长,除非发生了我不知道的奇怪事情。"我认为你仍然是正确的。
【解决方案2】:

concat 会不会更有用?

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

【讨论】:

    【解决方案3】:

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

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

    我正在研究这是否可行。

    【讨论】:

    • 这听起来很有趣。奇怪的是,这听起来像是最有可能发生的问题。
    • 您可以将列更改为 VARCHAR(MAX) 并尝试一下吗?否则,请尝试临时表的想法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多