5

我正在尝试替换我的一个 SQL 列中的文本。要替换的文本可以通过查找/*REPLACE*/下一个字符为数值的所有引用来轻松找到,该数值必须增加 5000。

下面显示了原始值的示例。

var checkIn = moment(FIELD(/*REPLACE*/4,/*REPLACE*/9).GET());  
var checkOut = moment(FIELD(/*REPLACE*/4,/*REPLACE*/10).GET());    
if (checkIn > checkOut) {      
    FIELD(/*REPLACE*/4,/*REPLACE*/10).SET(checkIn.format("DD MMM YYYY"));      
    checkOut = moment(FIELD(/*REPLACE*/4,/*REPLACE*/10).GET());  
}    
FIELD(/*REPLACE*/4,/*REPLACE*/11).SET(parseFloat(checkOut.diff(checkIn, "days")).toFixed(2));

我需要找到所有引用/*REPLACE*/并将以下数字字符增加 5000。

下面显示了新值的示例。

var checkIn = moment(FIELD(5004,5009).GET());  
var checkOut = moment(FIELD(5004,5010).GET());    
if (checkIn > checkOut) {      
FIELD(5004,5010).SET(checkIn.format("DD MMM YYYY"));      
checkOut = moment(FIELD(5004,5010).GET());  
}    
FIELD(5004,5011).SET(parseFloat(checkOut.diff(checkIn, "days")).toFixed(2));

我从基本开始,但在文本后面找到数字字符时迷失了方向。

SELECT column.REPLACE(column, '/*REPLACE*/',

请问有什么帮助吗?

4

3 回答 3

2

假设您的列是 varchar 或类似类型(不是文本),您可以使用 T-SQL 脚本执行该替换。

您将需要迭代每个 / REPLACE / 字符串,然后有另一个嵌套循环来搜索下一个后续数字。一旦知道最后一个数字在哪里,就可以将这些数字转换为数字,并将所需的字符串替换为该数字 + 5000。

我给你举个例子。您可以立即运行此脚本以对其进行测试,但您需要将其调整为适合您的表/列。

此外,如果您的列是 Text 类型,也可以这样做,但需要将文本拆分为 varchar 块并迭代每个块。如果您需要帮助,请告诉我。

这是代码:

-- table variable, simulating the table to be modified, for testing purposes
-- all references to @tbl and col should be replaced by the intended table/column
declare @tbl table (col varchar(max))
insert into @tbl values ('var checkIn = moment(FIELD(/*REPLACE*/4,/*REPLACE*/9).GET());  
var checkOut = moment(FIELD(/*REPLACE*/4,/*REPLACE*/10).GET());    
if (checkIn > checkOut) {      
    FIELD(/*REPLACE*/4,/*REPLACE*/10).SET(checkIn.format("DD MMM YYYY"));      
    checkOut = moment(FIELD(/*REPLACE*/4,/*REPLACE*/10).GET());  
}    
FIELD(/*REPLACE*/4,/*REPLACE*/11).SET(parseFloat(checkOut.diff(checkIn, "days")).toFixed(2));')

declare @col_txt varchar(max),
        @replace_at int, @digit_start int, @digit_end int, @number int

select @col_txt = col from @tbl -- TODO add a where clause, and consider using a cursor for each row

set @replace_at = 0
-- loop for each /*REPLACE*/ string
while (1=1) begin
    set @replace_at = charindex('/*REPLACE*/', @col_txt, @replace_at + 1)
    if (@replace_at = 0) break

    set @digit_start = @replace_at + len('/*REPLACE*/')
    set @digit_end = @digit_start
    -- loop while the next char is a number, and save its position
    while (ascii(substring(@col_txt, @digit_end, 1)) between ascii(0) and ascii(9)) set @digit_end = @digit_end + 1
    set @number = cast(substring(@col_txt, @digit_start, @digit_end - @digit_start) as int) + 5000
    -- replace current /*REPLACE*/ and number with the found number + 5000 in the current text chunk
    set @col_txt = stuff(@col_txt, @replace_at, @digit_end - @replace_at, @number)
end

-- update the original table with the value
update @tbl set col = @col_txt -- TODO add a where clause

-- only for test purposes
select col from @tbl
于 2013-07-01T17:46:36.007 回答
0

您真的需要在 SQL Server 上执行此操作并使用 T-SQL 吗?第 3 代编程语言(例如 C++、C#、VB.NET 等)支持更强大的字符串操作方法;例如,您可以使用在 SQL Server 中未原生实现的正则表达式。

您可以设计一个 SQL CLR 函数或过程来解决此限制,但更合适的替代方法是使用客户端应用程序。您还可以使用带有脚本转换的 SQL Server 集成服务(您可以使用 C# 或 VB.NET)。

机器学习

于 2013-06-26T14:18:21.543 回答
0

您可以创建一个简单的 CLR 函数来为您执行正则表达式操作。拥有可用于 SQL 查询的正则表达式函数会非常有帮助。

看看这篇文章:正则表达式使模式匹配和数据提取更容易

于 2013-06-26T17:22:53.580 回答