如果部分密钥承租人与签名密钥上的承租人不匹配,如何将状态更新为错误匹配字符?

How to update status to wrong match characters where portion key charterer not match charterer on signature key?

我在 SQL 服务器 2012 上工作我遇到问题我无法使用不匹配字符更新状态,其中部分密钥不等于基于组 ID 的签名密钥字符。

Group Id 表示为: $$C$$$**$ (1=,2= ,3=C,4=,5=,6=**,7=)

Signature Key      Group Id  Portion Key      status       Signature Key(group Id 3)       Reason 
*$*$C$***$**$**$*   3          s              wrong              C                         s <> C

如上一行所示,状态匹配字符错误,因为签名密钥上的组 ID 3 将是 C 和部分键是 s 字符,所以我将使用错误的匹配字符更新状态,因为 s 不等于 c

数据样本:

Create table #Ref
(
SignatureKey  nvarchar(50),
GroupId int,
PortionKey nvarchar(50),
Status nvarchar(100)
)
insert into #Ref(SignatureKey,GroupId,PortionKey,status)
values
('*$*$C$***$**$**$*',3,'s',NUll),
('*$*$*$FG$*$**$*',4,'F',NUll),
('*$*$*$***$*$D$*',6,'D',NUll),
('*$*$*$***$***$**$*',2,'g',NUll),
('*$**$*$***$L$**$*',5,'f',NUll)

预期结果:

Signature Key      Group Id  Portion Key             Status
*$*$C$***$**$**$*   3          s                wrong Match chatterers
*$*$*$FG$*$**$*     4          F                wrong Match chatterers
*$*$*$***$*$D$*     6          D                wrong Match chatterers
*$*$*$***$***$**$*  2          g                wrong Match chatterers
*$**$*$***$L$**$*   5          f                wrong Match chatterers

更多解释见下图:

我制作了这个函数,但不知道如何调用它:

Create FUNCTION [dbo].[fn_split_string]
(
    @string    nvarchar(max),
    @delimiter nvarchar(max)
)

RETURNS TABLE AS RETURN
(
    SELECT 
      --ROW_NUMBER ( ) over(order by (select 0))                            AS id     --  intuitive, but not correect
        Split.a.value('let $n := . return count(../*[. << $n]) + 1', 'int') AS id
      , Split.a.value('.', 'NVARCHAR(MAX)')                                 AS value
    FROM
    (
        SELECT CAST('<X>'+REPLACE(@string, @delimiter, '</X><X>')+'</X>' AS XML) AS String
    ) AS a
    CROSS APPLY String.nodes('/X') AS Split(a)
)

根据我的示例如何调用

select * from [dbo].[fn_split_string]('*$*$C$***$**$**$*','$') pc

网上借用了一个字符串拆分函数(Link:https://www.sqlteam.com/forums/topic.asp?TOPIC_ID=50648)

分割字符串的功能returns一table。例如,如果我 运行

SELECT * FROM dbo.Split('*$**$*$***$L$**$*','$')

返回结果为:

一旦你有了拆分字符串的功能,你就可以使用 CROSS APPLY 来 运行 它对你的 table.

中的所有行
declare @Ref table
(
SignatureKey  nvarchar(50),
GroupId int,
PortionKey nvarchar(50),
Status nvarchar(100)
)
insert into @Ref(SignatureKey,GroupId,PortionKey,status)
values
('*$*$C$***$**$**$*',3,'s',NUll),
('*$*$*$FG$*$**$*',4,'F',NUll),
('*$*$*$***$*$D$*',6,'D',NUll),
('*$*$*$***$***$**$*',2,'g',NUll),
('*$**$*$***$L$**$*',5,'f',NUll)

select r.*, f.* 
,case
when r.PortionKey = f.Data then 'match' else 'not match' 
end
from @Ref r
cross apply
dbo.Split(r.SignatureKey,'$') f where r.GroupId = f.Id

结果集为:

希望这对您有所帮助。