#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
Результирующий набор равен:
Надеюсь, это полезно.