2013-02-22 4 views
3

각 삭제 문의 동일한 조건 (where 절)을 사용하여 여러 테이블에서 데이터를 삭제하고 싶습니다.SQL Server 저장 프로 시저에서 변수 목록 선언

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 문에서 ID를 저장하는 목록을 선언하는 방법이 있습니까?

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

을하지만

하위 쿼리는 1 개 이상의 값을 반환 불평 :

나는 시도했다. 하위 쿼리가 =,! =, <, < =,>,> = 또는 하위 쿼리가 표현으로 사용되는 경우에는 허용되지 않습니다.

감사합니다.

당신은 어쨌든 표를해야하지만 적어도 당신은 같은 매번 수행하여 처리 톤을 피하기
+0

왜 톱 1이이 작업을하는지 생각해보십시오. http://stackoverflow.com/questions/11232751/sql-error-subquery-returned-more-than-1-value – Tim

답변

9

:

-- 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) 

당신은 또한 임시 테이블을 사용할 수 있습니다, 그것은 대신의 같은 모양 @ ID가 필요하며 작업이 완료되면 임시 테이블을 삭제해야합니다.

임시 테이블 (실제 테이블) 또는 테이블 변수 (테이블과 같은 메모리) 중에서 선택하려면 몇 가지 테스트를 실제로 수행해야하지만 정의에 따라 복잡한 데이터는 임시 테이블에서 더 잘 작동합니다. 짧은 기간 동안 적은 수의 ID를 보유해야한다면 테이블 변수가 더 좋습니다.

What's the difference between a temp table and table variable in SQL Server?

+0

테이블 변수는 메모리가 아닙니다. 그것은 신화입니다. 비 신화적인 차이에 대해서는 [내 대답은 여기에] (http://dba.stackexchange.com/questions/16385/whats-the-difference-between-a-temp-table-and-table-variable-in-sql- 서버/16386 # 16386) –

+0

나는 그것을 정말로 의미하지 않았다. 그리고 또한 차이에 대한 링크를 게시했다. – lolol

2

당신은 임시 테이블을 선언 할 수 다음이 삭제됩니다 테이블 식별자로 선택합니다. 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) 

에서

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 
2

당신이 기록의 일부 hundreeds 이상이있는 경우, 당신은 임시 테이블 대신 테이블 변수를 사용할 수 있습니다.

관련 문제