【问题标题】:Replace string in UNITEXT column sybase database替换 UNITEXT 列 sybase 数据库中的字符串
【发布时间】:2017-08-24 09:07:03
【问题描述】:

我们正在使用 Sybase 数据库,并有下表。

CREATE TABLE table_1
(id            VARCHAR(50) NOT NULL
,data_values   UNITEXT         NULL
,last_modified DATETIME        NULL)

我需要替换存储为 UNITEXT 类型的 data_values 列的单词。

我找到了link,但这对我们如何替换单词没有帮助。

我尝试过的查询如下。

declare @val varbinary(16)
select  @val = textptr(data_values) from table_1
writetext table_1.data @val "Some text"

我必须动态生成要在 data_values 字段中设置的文本。文本本身将从同一列本身获取,并且必须在设置到该字段之前进行处理(几个单词更改)。

【问题讨论】:

标签: sql sybase sap-ase


【解决方案1】:

一些背景:

  • 如果您运行的是 ASE 15.7(或更高版本),您可以声明(uni)text 类型的变量
  • textptr() 函数返回一个 varbinary(16) 值,它实际上是一个指向文本数据在数据库中的位置的指针 [在手册中它们通常显示 @val = textptr(...) 这有点误导,因为 textptr() 不是t 返回文本列的值,而是指向文本列的指针]
  • 可以像访问任何其他列一样直接访问实际的文本列值
  • writetext 命令在将值写入文本列时提供了update 命令的替代方法; update 是记录操作,而writetext 默认情况下是非记录操作

一些示例 SQL(使用您的表定义):

insert table_1 values ('1','original.old text value',getdate())
go

declare @ptr     varbinary(16),
        @unitext unitext,
        @varchar varchar(16384)

-- obtain text pointer and unitext value for a desired row

select  @ptr     = textptr(data_values),                  -- pointer to unitext column
        @unitext = data_values,                           -- actual unitext value
        @varchar = convert(varchar(16384),data_values)    -- unitext converted to character
from    table_1
where   id = '1'

select 'original' as 'when', @unitext as '@unitext', @varchar as '@varchar'

-- logged update of the data_values column

begin tran

update  table_1
set     data_values = 'update.new text value'
where   id = '1'

select  @unitext = data_values,
        @varchar = convert(varchar(16384),data_values)
from    table_1
where   id = '1'

select 'after update' as 'when', @unitext as '@unitext', @varchar as '@varchar'

-- non-logged update of the data_values column

writetext table_1.data_values @ptr 'writetext.new text value'

select  @unitext = data_values,
        @varchar = convert(varchar(16384),data_values)
from    table_1
where   id = '1'

select 'after writetext' as 'when', @unitext as '@unitext', @varchar as '@varchar'

-- rollback to original value

rollback tran

select  @unitext = data_values,
        @varchar = convert(varchar(16384),data_values)
from    table_1
where   id = '1'

select 'after rollback' as 'when', @unitext as '@unitext', @varchar as '@varchar'
go

 when             @unitext                      @varchar
 -----------------------------------------------------------------------
 original         original.old text value       original.old text value

 when             @unitext                      @varchar
 -----------------------------------------------------------------------
 after update     update.new text value         update.new text value

 when             @unitext                      @varchar
 -----------------------------------------------------------------------
 after writetext  writetext.new text value      writetext.new text value

 when             @unitext                      @varchar
 -----------------------------------------------------------------------
 after rollback   original.old text value       original.old text value

已编辑:

  • 更新为将值拉入unitext 变量和varchar 变量中
  • 仍有一些与字符串相关的函数不适用于 (uni)text,因此可能需要使用数据的字符版本
  • 另外,如果 varchar 碰巧损坏了数据,则可以将 varchar 替换为 univarchar,尽管最大长度需要从 16384 减少到 8192

【讨论】:

  • 嗨,马克!感谢您付出的努力。我面临的唯一挑战是,当我们将 varchar(30) 传递给 convert 函数时,我们限制了可以从文本字段转换的文本大小,并且无法处理包含在文本字段中的整个文本.
  • varchar(30) 只是一个例子;我已经更新了我的答案以显示将数据拉入unitextvarchar(16384) 变量;见文末注释
猜你喜欢
  • 1970-01-01
  • 2017-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多