2012-07-27 2 views
0

나는 임의의 값 목록을 가지고 있으며 T-SQL을 사용하여 여러 테이블에서 레코드를 삭제하려고합니다. 앞으로 다른 값 목록을 사용하여 스크립트를 다시 사용하고 싶습니다. 이것은 디버깅 목적으로 만 사용됩니다 (레코드를 지우고 새 버전의 소프트웨어로 다시 가져올 수 있기를 원합니다). 그래서 꽤 필요하지 않습니다.Sql Server 임의의 값 배열을 기반으로 여러 테이블에서 삭제하는 방법?

지금까지 내가 가진 :

DECLARE @RequestIDList table(Request_ID nvarchar(50) NOT NULL) 
INSERT INTO @RequestIDList (Request_ID) VALUES 
('00987172'), 
('01013218'), 
('01027886'), 
('01029552'), 
('01031476'), 
('01032882'), 
('01033085'), 
('01034446'), 
('01039261') 
DELETE FROM Request WHERE Request_ID IN (SELECT Request_ID FROM @RequestIDList) 
DELETE FROM RequestTest WHERE Request_ID IN (SELECT Request_ID FROM @RequestIDList) 

이 작동하는 것 같다,하지만 더 좋은 방법은 무엇입니까? IN 절에 직접 변수를 사용하는 방법을 알아낼 수 없습니다 (예 : "Where Request_ID IN @RequestIDList").

답변

1

먼저 당신이 .IT가에 differnt 설명 this 기사에서 참조하시기 바랍니다 그리고 더 furthur 자세한 내용은 SP

CREATE PROCEDURE usp_delete 
@RequestIDList varchar(50) 
AS 
Begin 
DELETE FROM Request as req inner join 
inputParser (@RequestIDList) i on req.Request_ID = i.number 
End 

EXEC usp_delete '1, 2, 3, 4' 

에서 그 기능을 사용하여 입력을

CREATE FUNCTION inputParser (@list nvarchar(MAX)) 
RETURNS @tbl TABLE (number int NOT NULL) AS 
BEGIN 
DECLARE @pos  int, 
    @nextpos int, 
    @valuelen int 

SELECT @pos = 0, @nextpos = 1 

WHILE @nextpos > 0 
BEGIN 
SELECT @nextpos = charindex(',', @list, @pos + 1) 
SELECT @valuelen = CASE WHEN @nextpos > 0 
         THEN @nextpos 
         ELSE len(@list) + 1 
       END - @pos - 1 
INSERT @tbl (number) 
    VALUES (convert(int, substring(@list, @pos + 1, @valuelen))) 
SELECT @pos = @nextpos 
END 
RETURN 
END 

을 구문 분석하는 함수를 작성해야 메서드는 SQL 서버 버전에 따라 달라집니다. SQl 서버 2008의 경우 입력 파서를 더 단순화하는 TVP를 사용합니다.

2

빠른 스크립트 :

SET NOCOUNT ON 

-- Temp table so it can be joined against in dynamic SQL 
IF OBJECT_ID('tempdb..#RequestIDList') IS NOT NULL 
    DROP TABLE #RequestIDList 
GO 

CREATE TABLE #RequestIDList (Request_ID nvarchar(50) NOT NULL) 
INSERT INTO #RequestIDList (Request_ID) VALUES 
('00987172'),('01013218'),('01027886'),('01029552'), 
('01031476'),('01032882'),('01033085'),('01034446'), 
('01039261') 

DECLARE @TableList TABLE (TableName NVARCHAR(128) NOT NULL) 
INSERT @TableList VALUES 
('Request'), 
('RequestTest') 

DECLARE 
    @sqlcmd VARCHAR(4000), 
    @table VARCHAR(128) 

-- Loop through the tables in your delete list 
DECLARE c CURSOR LOCAL FORWARD_ONLY STATIC READ_ONLY FOR 
SELECT TableName 
FROM @TableList 
ORDER BY TableName 

OPEN c 
FETCH NEXT FROM c INTO @table 
WHILE @@FETCH_STATUS = 0 
BEGIN 

    -- Assuming all tables in schema dbo 
    -- Assuming all tables have column Request_ID 
    SET @sqlcmd = 'DELETE FROM t FROM ' + QUOTENAME(@table) 
       + ' t JOIN #RequestIDList r ON r.Request_ID = t.Request_ID' 

    -- PRINT @sqlcmd 
    EXEC (@sqlcmd) 
    FETCH NEXT FROM c INTO @table 
END 

CLOSE c 
DEALLOCATE c 

-- Clean up 
DROP TABLE #RequestIDList 
+0

이 유형의 문제에 대한 좋은 일반 템플릿. 감사 –

관련 문제