编写一个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