Как обновить статус до символов неправильного соответствия, когда фрахтователь ключа части не соответствует фрахтователю по ключу подписи?

#sql-server #tsql #stored-procedures #sql-server-2012 #sql-function

#sql-server #tsql #хранимые процедуры #sql-server-2012 #sql-функция

Вопрос:

Я работаю на SQL server 2012 и сталкиваюсь с проблемой, я не могу обновить статус символом несоответствия, где ключ части не равен символу ключа подписи на основе идентификатора группы.

Идентификатор группы, представленный как: $$ 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
  

в строке выше укажите мне символ неправильного соответствия по статусу, потому что идентификатор группы 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
  

Комментарии:

1. Не могли бы вы рассказать нам, что вы пробовали до сих пор? На очень высоком уровне вам нужно будет создать функцию разделения строки, которая разделит [SignatureKey], используя tokenizer ‘$’. Затем вам нужно будет сопоставить символ, указанный позицией [Groupid], с [PortionKey].

2. да, это на самом деле то, что мне нужно

3. можете ли вы сказать мне, как я это делаю, я использую SQL server 2012

4. смотрите сообщение об обновлении

Ответ №1:

Я позаимствовал функцию разделения строк из Интернета (Ссылка:https://www.sqlteam.com/forums/topic.asp?TOPIC_ID=50648 )

Функция возвращает таблицу с разделенной строкой. Например, если я запускаю

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

Возвращаемый результат равен:

введите описание изображения здесь

Как только у вас есть функция для разделения строки, вы можете использовать ПЕРЕКРЕСТНОЕ ПРИМЕНЕНИЕ, чтобы запустить ее для всех строк в вашей таблице.

 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
  

Результирующий набор равен:

введите описание изображения здесь

Надеюсь, это полезно.