Sql server SQL Server 2019,使用T-SQL,I';我试图提取-&引用;及/&引用;从订单表中的“订单号”列

Sql server SQL Server 2019,使用T-SQL,I';我试图提取-&引用;及/&引用;从订单表中的“订单号”列,sql-server,Sql Server,SQL数据库的jobs表中的order number列具有以下结构:“2006925-06/01” “-”和“/”之间的字符串值表示链接到jobs表中的job order编号的销售订单行。我试图使用下面的语句来提取销售订单行值,并将其表示为PulledString。当我执行语句时,我得到一个错误 传递给LEFT或SUBSTRING函数的长度参数无效 不知道怎么了 , CASE WHEN [ordernumber] Is Not Null THEN SUBSTRING([ordern

SQL数据库的jobs表中的order number列具有以下结构:“2006925-06/01”

“-”和“/”之间的字符串值表示链接到jobs表中的job order编号的销售订单行。我试图使用下面的语句来提取销售订单行值,并将其表示为PulledString。当我执行语句时,我得到一个错误

传递给LEFT或SUBSTRING函数的长度参数无效

不知道怎么了

  , CASE WHEN [ordernumber] Is Not Null THEN 
    SUBSTRING([ordernumber],CHARINDEX('-', [ordernumber], CHARINDEX('-', [ordernumber]) + 1) -0,
        LEN([ordernumber]) - CHARINDEX('/', [ordernumber], CHARINDEX('/', [ordernumber]) + 1) - 
            CHARINDEX('-', REVERSE(rtrim([ordernumber])))) ELSE '' END AS PulledString 

如果始终为两个字符,则这非常简单:

select left(stuff(ordernumber, 1, charindex('-', ordernumber), ''), 2)

阅读这也适用于不同的分隔符。然后规范化模式。工作编号应该单独列在自己的栏中,没有其他内容。谢谢,戈登。我将该代码添加到Case语句中,并能够将销售订单行值剥离出来并存储在列中。销售订单行的长度不得超过两个字符。销售订单表中的销售订单行存储为整数值。我在想,如果我在提取的工单值介于01和09之间时修剪前导零,我应该很有可能匹配出现工单编号的销售订单行。@Rick。实际上,您可以使用
like
进行
连接
,这要简单得多。但这不是你在这里问的问题。如果您提供了示例数据、期望的结果以及对您想要做的事情的解释,那么在获得最佳解决方案时就有了更大的灵活性。这回答了您在这里提出的问题。“2006847-06/01”。是工单(作业)字符串。位置9和10中的06表示它来自的销售订单行。销售订单从1行到99行不等。使用下面的查询(连接没有问题),如果我运行的是工作单2006847-10/11,我将获得与操作数相关的预期行数。如果我运行工单2006847-06/01,则不会返回任何内容。在我看来,字符串值09与销售订单行号09不匹配。有关联接和where子句,请参见下一块。从[SalesOrder]上的dbo.WorkOrder内部联接[SalesOrder]。SalesOrderID=[WorkOrder]。SalesOrderID或子字符串([WorkOrder]。OrderNumber,1,LEN(SalesOrder.OrderNumber))=SalesOrder.OrderNumber内部联接[SalesOrderLine]。SalesOrderID=[SalesOrderID].SalesOrderID和item.itemid=SalesOrderLine.itemid和子字符串([WorkOrder].OrderNumber,9,LEN(2))=[SalesOrderLine]。[LineNo]内部联接[SalesOrderDelivery],位于[SalesOrderLine]。SalesOrderLineID=[SalesOrderDelivery]。其中[WorkOrder]。OrderNumber='2006847-10/11'