在 SQL Server 2019 中修剪 nvarchar 参数

Trimming a nvarchar param in SQL Server 2019

我有一个将字符串发送到我的参数之一的存储过程

@deliveryName [nvarchar](255)

发货名称有时可以是“发货示例1”,有时可以是“发货方式-发货示例1”,也可以是“其他-发货示例1”

这不能在它到达存储过程之前进行编辑,是否有一种安全的方法来 trim 纯粹在 sql 服务器 MSSQL 中的第一个“-”之前的所有内容?我说有没有安全的方法来处理快递名称中有多个“-”的情况。例如“交付方式 - 交付示例 - 2”我只想输出“交付示例 - 2”

到目前为止我看过的所有地方都在说要使用一个案例(类似这样)

CASE
    WHEN str LIKE ',%,' THEN SUBSTRING(str, 2, LEN(str)-2)
    WHEN str LIKE ',%'  THEN RIGHT(str, LEN(str)-1)
    WHEN str LIKE '%,'  THEN LEFT(str, LEN(str)-1)
    ELSE str
END

对于所有可能发生的情况,但每天总会有新方法,因此很难跟上。

对于没有“-”的名称,您可以将“-”附加到 DeliveryName 变量,获取“-”首次出现的索引并获取其右侧的字符串指数

SELECT RIGHT(DeliveryName, CHARINDEX('-', DeliveryName+'-')+2) FROM #Temp

CREATE TABLE #Temp ( DeliveryName NVARCHAR(255))

INSERT INTO #Temp VALUES ('Delivery example-1')
INSERT INTO #Temp VALUES ('Delivery method - Delivery example 1 ')
INSERT INTO #Temp VALUES (' something else - Delivery example 1')
INSERT INTO #Temp VALUES (' Delivery method - Delivery example - 2')

SELECT RIGHT(DeliveryName, CHARINDEX('-', DeliveryName+'-')+2) FROM #Temp

output
--------------------------------------------------------
(No column name)
Delivery example 1
Delivery example 1 
Delivery example 1 
Delivery example - 2
Delivery example-1

看起来它只需要 SUBSTRINGCHARINDEXPATINDEX 来获取第一个破折号的位置。

测试片段

declare @deliveryName nvarchar(255);
set @deliveryName = 'Delivery method - Delivery example - 2';

set @deliveryName = ltrim(substring(@deliveryName, charindex('-', @deliveryName)+1, len(@deliveryName)));

select @deliveryName as deliveryName;
deliveryName
Delivery example - 2

演示 db<>fiddle here