Объявить список переменных в хранимой процедуре SQL Server

Я хотел бы удалить данные из нескольких таблиц с одинаковыми условиями (предложение where) для каждого оператора удаления.

delete from tblA where id in (select x.id from tblX x where name like N'%test%')
delete from tblB where id in (select x.id from tblX x where name like N'%test%')
delete from tblC where id in (select x.id from tblX x where name like N'%test%')
delete from tblD where id in (select x.id from tblX x where name like N'%test%')

Есть ли способ объявить список, в котором хранятся идентификаторы из оператора select выше?

Я старался:

declare @ids int
set @ids = select x.id from tblX x where name like N'%test%'

Но жалуется, что

Подзапрос вернул более 1 значения. Это не разрешено, если вложенный запрос следует за =, !=, ‹, ‹= , >, >= или когда вложенный запрос используется как выражение.

Пожалуйста, посоветуйте, спасибо.


person Eddie    schedule 22.02.2013    source источник
comment
Подумайте, почему у топ-1 это работает. stackoverflow.com/ вопросы/11232751/   -  person Tim    schedule 22.02.2013


Ответы (3)


В любом случае вам понадобится таблица, но, по крайней мере, вы избежите тонны обработки, делая каждый раз лайк:

-- create a table variable
declare @ids table
(
  id int not null
)

-- insert the id into the table variable
insert into @ids
select id from table1 where column1 like '%something%'

-- delete
delete from tablen where id in (select * from @ids)

Вы также можете использовать временную таблицу, она выглядит так же, но вместо @ids вам понадобятся #ids, и вам нужно удалить временную таблицу после завершения работы.

Чтобы выбрать между временной таблицей (физической таблицей) или табличной переменной (памятью, такой как таблица), вам действительно нужно будет выполнить некоторые тесты, но по определению сложные данные лучше работают во временных таблицах. Если вам просто нужно удерживать небольшое количество идентификаторов в течение короткого периода времени, я уверен, что табличные переменные лучше.

В чем разница между временным таблица и табличная переменная в SQL Server?

person lolol    schedule 22.02.2013
comment
Табличные переменные — это не только память. Это миф. Для не мифических различий см. мой ответ здесь - person Martin Smith; 23.02.2013
comment
Я действительно не это имел в виду, а также разместил ссылку на различия. - person lolol; 25.02.2013

Вы можете объявить временную таблицу, а затем выбрать в этой таблице идентификаторы, которые вы будете удалять.

CREATE TABLE #IDS_from_tblA (id int)
INSERT INTO #IDS_from_tblA(id)
    SELECT x.id FROM tblA WHERE x.id in (select x.id from tblX x where name like N'%test%')
delete from tblA where id in (select x.id from tblX x where name like N'%test%')

(Do whatever you want to do with the ids)

DROP TABLE #IDS_from_tblA 
person Narnian    schedule 22.02.2013

В sql-сервере 2008+

declare @IdList table (Id int primary key)

insert into @IDList (Id)
select x.id from tblX x where name like N'%test%'

delete from tblA where id in (select x.id from @IDList x)

Если у вас более нескольких сотен записей, вы можете использовать временную таблицу вместо табличной переменной.

person Morzel    schedule 22.02.2013