编写一个SQL字符提取函数

问题背景

      今天(2022年6月13日)早上,工程师王工因为工作中的一个问题前来求助。数据库中一张表中的有一个数据类型为NVARCHAR(128)、名称为ORDER_ID的字段。该字段被其他工程师误操作,导致字段值有点小问题。

用实际例子说明问题,这是其中的一个字段值:9|00792|1010402

第一个 |(树杠)前面的9代指的是客户下订单的次数。ORDER_ID字段就是设计初衷就是保存客户的下订单的次数,但是,因为某位工程师的误操作,现在是下单次数加上了一些不需要的字符。

王工的需求就是把诸如9|00792|1010402、14|00800|1010402这些字段值中的9和14提取出来并覆盖更新原值。

解决思路

      编写一个标量值函数,调用函数去改写字段值。

1.编写函数

 1 CREATE FUNCTION ExtractString(@inputString_Argument NVARCHAR(128))
 2 RETURNS NVARCHAR(128)
 3 AS 
 4 BEGIN
 5 DECLARE @inputString NVARCHAR(128)
 6 DECLARE @workingChar CHAR
 7 DECLARE @bitNumber INT
 8 
 9 SET @inputString = @inputString_Argument
10 SET @bitNumber ='1'
11 
12 SET @workingChar = SUBSTRING(@inputString,1,1)
13 WHILE(@workingChar !='|')
14 BEGIN
15 SET @bitNumber = @bitNumber +1;
16 SET @workingChar = SUBSTRING(@inputString,@bitNumber,1);
17 END
18 
19 RETURN SUBSTRING(@inputString,1,@bitNumber-1)
20 END

2.测试应用函数

1 DECLARE @inputString1_Argument NVARCHAR(128)
2 DECLARE @inputString2_Argument NVARCHAR(128)
3 SET @inputString1_Argument ='9|00792|1010402'
4 SET @inputString2_Argument ='14|00800|1010402'
5  
6 SELECT @inputString1_Argument AS 原值, dbo.ExtractString(@inputString1_Argument) AS 提取出来的字符
7 SELECT @inputString2_Argument AS 原值, dbo.ExtractString(@inputString2_Argument) AS 提取出来的字符

测试结果:

假设字段ORDER_ID和标量值函数ExtractString同在名为Customer的数据库中,

ORDER_ID字段是数据库 customerInfo的一个字段。

更新语句为:

1 UPDATE customerInfo
2 SET ORDER_ID = dbo.ExtractString(ORDER_ID)

假如标量值函数ExtractString不在Customer数据库中,在另一个名为Employee的数据库中,

更新语句为:

1 UPDATE customerInfo
2 SET ORDER_ID = Employee.dbo.ExtractString(ORDER_ID)

3.删除函数

1 DROP FUNCTION dbo.ExtractString

 

posted @ 2022-06-13 17:16  美人她爹  阅读(140)  评论(0编辑  收藏  举报