2015-10-22 1 views
3

У меня есть список ids, который я хочу удалить, но я должен проверить, нет ли этих идентификаторов в других таблицах. Если они есть, я хочу вставьте эти идентификаторы в другой список, разделенный столбцами. Предполагая, что @keywords является списком ids.Удаление нескольких строк с помощью идентификаторов и проверка того, нет ли этих идентификаторов в других таблицах

SELECT Replace(item,'''','') AS KeywordId 
FROM Splitdelimiterstring(@keywords,',')IF NOT EXISTS 
( 
     SELECT KeywordId 
     FROM ContentKeyword 
     WHERE KeywordId = ?? 
     UNION 
     SELECT KeywordId 
     FROM JobKeyword 
     WHERE KeywordId = ?? 
     UNION 
     SELECT KeywordId 
     FROM CategoryGroup 
     WHERE KeywordId= ??) 
BEGIN 
    DELETE 
    FROM Keywords 
    WHERE KeywordId =?? 
END 
    ELSE ?? 

ответ

1

Первое, что вам нужно, это написать 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 
+0

Почему бы не объявить таблицу, как объявляют TempTable в виде таблицы (Id) и Вставить в TempTable Выберите Заменить (пункт, «» «», «») КАК KeywordId ОТ Splitdelimiterstring (@keywords, «») – Sana

+0

Приведенный выше код возвращает идентификаторы, отсутствующие в других таблицах. Что вы хотите сделать с ними, зависит от вас –

+1

вы пробовали SQL? –

1
declare @temptable as table(
Id int 
); 
Insert into @temptable values(//ids) 

Delete from Keyword 
where Id not in (
Select KeywordId from JobKeyword 
where KeywordId in (select Id from @temptable) 
union 
Select KeywordId from ContentKeyword 
where KeywordId in 
(Select Id from @temptable) 
union 
Select KeywordId from CategoryGroup 
where KeywordId in 
(Select Id from @temptable) 
) 


Select Keyword from Keyword where Id 
in( 
Select Id from @temptable 
where Id not in 
(
Select KeywordId from JobKeyword 
where KeywordId in (select Id from @temptable) 
union 
Select KeywordId from ContentKeyword 
where KeywordId in 
(Select Id from @temptable) 
union 
Select KeywordId from CategoryGroup 
where KeywordId in 
(Select Id from @temptable) 
) 
) for xml auto 

как об этом ?

+0

Я сделал некоторые изменения в вашем коде, и он блестяще работал:). Спасибо. – Sana