Объявите переменные и вызовите - PullRequest
0 голосов
/ 25 октября 2019

У меня есть куча запросов на удаление, которые я должен скопировать в значения для каждого. Например;

delete from source where id in (3300,3301, 2872)
delete from performance where srcid in (3300,3301, 2872)
delete from title where id in (3300,3301, 2872)
delete from name where srcid in (3300,3301, 2872)

Я хочу объявить значения (3300,3301, 2872), потому что они меняются каждый раз. Я должен скопировать для каждого запроса. Я понимаю, как объявить, когда это одно число с объявлением и установить @source =, но я не совсем понимаю, как получить входные данные

Я пробовал много вариантов из сети. Это последний вариант. Не выдает ошибку, но не находит элементы в списке. Я не смог выяснить создание sp или функции из сети.

DECLARE @sourcelist VARCHAR = '2380,2379'
--SET @sourcelist = '2380' + ',' + '2379'

select * from dbo.Source where id in (@sourcelist)



DECLARE @sourcelist VARCHAR = '2380,2379'
--SET @sourcelist = '2380' + ',' + '2379'

select * from dbo.Source where id in (@sourcelist)

--------------------------------

Вот вариант sp

DECLARE @sourcelist VARCHAR(500)
DECLARE @delete1 NVARCHAR(4000)
SET @delete1 = 'delete from [EID].[FileLoadLog] where srcid in (CAST(@sourcelist AS varchar(500)))'

BEGIN
EXEC sp_executesql @delete1 
END

, каждый из которых представляет собой одну строку. Я ожидаю удаления 2 строк.

Ответы [ 3 ]

2 голосов
/ 25 октября 2019

Вы можете сделать это и с табличной переменной

declare @items table(
  id int
);

insert @items(id)
values (3300),(3301), (2872);

delete from source where id in (select id from @items);
delete from performance where srcid in (select id from @items);
delete from title where id in (select id from @items);
delete from name where srcid in (select id from @items);
1 голос
/ 25 октября 2019

Есть много способов сделать это. Если вы хотите использовать динамический SQL, вот вариант, в котором мы заменим "токен" на вашу строку идентификаторов

Пример

Declare @IDs varchar(max) = '3300,3301,2872'

Declare @SQL varchar(max) = '
delete from source where id in ([getList]);
delete from performance where srcid in ([getList]);
delete from title where id in ([getList]t);
delete from name where srcid in ([getList]);
'
Set @SQL = replace(@SQL,'[getList]',@IDs)
Exec(@SQL)
1 голос
/ 25 октября 2019

Похоже, вы используете SQL Server, поэтому я буду использовать этот синтаксис.

Просто сохраните значения во временной таблице и используйте это:

select v.*
into #temp_ids
from (values (3300), (3301), (2872)) v(id);

delete from source where id in (select id from #temp_ids);
delete from performance where srcid in (select id from #temp_ids);
delete from title where id in (select id from #temp_ids);
delete from name where srcid in (select id from #temp_ids);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...