Первое, что вам нужно, это написать UDF, который может разбивать строку на таблицу. Вот моя версия.
CREATE FUNCTION fn_Split(@Text varchar(MAX), @Delimiter varchar(20) = ',')
RETURNS @Strings TABLE
(
Position int IDENTITY PRIMARY KEY,
Value varchar(MAX)
)
AS
BEGIN
DECLARE @Index int = -1
WHILE (LEN(@Text) > 0)
BEGIN
SET @Index = CHARINDEX(@Delimiter , @Text)
IF (@Index = 0) AND (LEN(@Text) > 0)
BEGIN
INSERT INTO @Strings VALUES (@Text)
BREAK
END
IF (@Index > 1)
BEGIN
INSERT INTO @Strings VALUES (LEFT(@Text, @Index - 1))
SET @Text = RIGHT(@Text, (LEN(@Text) - @Index))
END
ELSE
SET @Text = RIGHT(@Text, (LEN(@Text) - @Index))
END
RETURN
END
Следующий шаг написать оператор выбора, который выбирает только те идентификаторы из вашей строки, НЕ присутствует ни в одном из ваших рабочих таблиц (ContentKeyword
, JobKeyword
, CategoryGroup
). Это довольно просто, если использовать вышеперечисленную функцию. Просто сделать LEFT JOIN
на функцию и проверить, если идентификатор присоединяемой таблицы равна нулю:
select s.Value from dbo.fn_Split('1,2,3,4,5', ',') s
left outer join ContentKeyword CK on CK.KeywordId = s.Value
left outer join JobKeyword JK on JK.KeywordId = s.Value
left outer join CategoryGroup JG on JG.KeywordId = s.Value
where
(1 = 1)
and CK.KeywordId is null
and JK.KeywordId Is null
and JG.KeywordId is null
EDIT
Вот мой полный тестовый сценарий:
if exists (select * from INFORMATION_SCHEMA.ROUTINES where ROUTINE_NAME = 'fn_Split')
drop function [dbo].[fn_Split]
go
CREATE FUNCTION fn_Split(@Text varchar(MAX), @Delimiter varchar(20) = ',')
RETURNS @Strings TABLE
(
Position int IDENTITY PRIMARY KEY,
Value varchar(MAX)
)
AS
BEGIN
DECLARE @Index int = -1
WHILE (LEN(@Text) > 0)
BEGIN
SET @Index = CHARINDEX(@Delimiter , @Text)
IF (@Index = 0) AND (LEN(@Text) > 0)
BEGIN
INSERT INTO @Strings VALUES (@Text)
BREAK
END
IF (@Index > 1)
BEGIN
INSERT INTO @Strings VALUES (LEFT(@Text, @Index - 1))
SET @Text = RIGHT(@Text, (LEN(@Text) - @Index))
END
ELSE
SET @Text = RIGHT(@Text, (LEN(@Text) - @Index))
END
RETURN
END
go
if exists (select * from INFORMATION_SCHEMA.TABLES where TABLE_NAME = 'ContentKeyword')
drop table ContentKeyword;
go
Create Table ContentKeyword
(
[KeywordId] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY,
[Name] [nvarchar](500) NOT NULL
)
go
if exists (select * from INFORMATION_SCHEMA.TABLES where TABLE_NAME = 'ContentKeyword')
drop table JobKeyword;
go
Create Table JobKeyword
(
[KeywordId] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY,
[Name] [nvarchar](500) NOT NULL
)
go
if exists (select * from INFORMATION_SCHEMA.TABLES where TABLE_NAME = 'ContentKeyword')
drop table CategoryGroup;
go
Create Table CategoryGroup
(
[KeywordId] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY,
[Name] [nvarchar](500) NOT NULL
)
go
--Insert dummy data
insert into CategoryGroup(Name) values('First value')
go
select S.Value from dbo.fn_Split('1,2,3,4,5', ',') S
left outer join ContentKeyword CK on CK.KeywordId = s.Value
left outer join JobKeyword JK on JK.KeywordId = s.Value
left outer join CategoryGroup JG on JG.KeywordId = s.Value
where
(1 = 1)
and CK.KeywordId is null
and JK.KeywordId Is null
and JG.KeywordId is null
Почему бы не объявить таблицу, как объявляют TempTable в виде таблицы (Id) и Вставить в TempTable Выберите Заменить (пункт, «» «», «») КАК KeywordId ОТ Splitdelimiterstring (@keywords, «») – Sana
Приведенный выше код возвращает идентификаторы, отсутствующие в других таблицах. Что вы хотите сделать с ними, зависит от вас –
вы пробовали SQL? –