2014-12-10 3 views
1

다른 TransID 값으로 여러 번 실행해야하는 SQL 스크립트가 아래에 나타납니다. 20,000 개의 TransID를 가지고 있기 때문에 다른 테이블에 20,00 개의 TransID를 놓고 CURSOR를 사용하여 한 번에 하나씩 값을 읽고 전체 쿼리를 실행해야한다고 생각합니다. 린스하고 반복하십시오. 이 스크립트에서 어떻게 작동하는지 정확히 알지 못하고 출력 값을 처리하여 값 당 여러 개의 출력을 얻을 수도 있습니다. 나는 테이블을 떨어 뜨리지 않고 마지막에 테이블을 계속 추가 할 수 있습니까?다른 값으로 SQL 쿼리를 여러 번 실행하십시오.

어떤 도움을 주셔서 감사합니다. 나는 이것에 아주 초록색이다. 내가받은 스크립트는 다음과 같습니다.

DECLARE @TransID uniqueidentifier SET @TransID = '**12f45e78-a234-1b3c-de34-123456789abc**' -- This is what will need to be changed 20,000 times. 


DECLARE @CustomerDB nvarchar(100) 
DECLARE @FullLength int 
DECLARE @TrimmedLength int 
CREATE TABLE #HGtmp (
HUGIdentity nvarchar(100)) 

DECLARE TBLCursor CURSOR FOR 
SELECT HoldGroupIdentity, SavesetIdentity FROM HoldSaveset 
OPEN TBLCursor 

DECLARE @HGIdentity int, @SSID int 
FETCH NEXT FROM TBLCursor INTO @HGIdentity, @SSID 
WHILE @@FETCH_STATUS = 0 
BEGIN 

IF @SSID = 
(SELECT SavesetIdentity FROM Saveset 
WHERE idTransaction = @transID) 
BEGIN 

DECLARE TBLCursor1 CURSOR FOR 
SELECT HoldGroupIdentity, HoldUserGroupID FROM HoldGroup 
OPEN TBLCursor1 
DECLARE @HGIdentity1 int, @HUGIdentity nvarchar(100) 

FETCH NEXT FROM TBLCursor1 INTO @HGIdentity1, @HUGIdentity 
WHILE @@FETCH_STATUS = 0 
BEGIN 

IF @HGIdentity = @HGIdentity1 
BEGIN 
SET @FullLength = (SELECT LEN(@HUGIdentity)) 
SET @TrimmedLength = (@FullLength - 40) 
SET @CustomerDB = SUBSTRING(@HUGIdentity, 4, @TrimmedLength) 
INSERT INTO #HGtmp (HUGIdentity) VALUES (@CustomerDB) 
END 

FETCH NEXT FROM TBLCursor1 INTO @HGIdentity1, @HUGIdentity 
END 
CLOSE TBLCursor1 
DEALLOCATE TBLCursor1 
END 
FETCH NEXT FROM TBLCursor INTO @HGIdentity, @SSID 
END 
SELECT DISTINCT HUGIdentity AS 'DA db with Legal Holds' FROM #HGtmp 

CLOSE TBLCursor 
DEALLOCATE TBLCursor 
DROP TABLE #HGtmp 
+0

여기에 커서를 사용해서는 안됩니다. 그럴 필요가 전혀 없습니다. 모두 당신이하고있는 일은 임시 테이블에 데이터를 삽입하는 것입니다. 이것은 하나의 insert 문이어야합니다. 다른 20,000 개의 행을 포함 시키려면 테이블에 넣거나 (또는 ​​select 문을 사용하는 것이 좋습니다) 조인하십시오. 이 모든 것은 루핑이없는 단일 insert 문이어야합니다. –

답변

0

나는 TransID를 식별 테이블이있는 임시 테이블에 넣을 것입니다. 예를 들어, 당신은 임시 테이블에 삽입 할 수 있습니다

create table #transid (transid varchar(255), id int identity(1,1)) 

이 테이블로 TransIDs를 삽입 #TransID, 당신은 각각 하나의 정수를 얻을 수 있습니다. 그런 다음 아래와 같이 WHILE 문으로 코드를 래핑이 각 TRANSID 당신이 당신의 임시 테이블에 코드를 한 번 순환을 삽입해야하기위한

declare @counter int = 1 

while @counter < (select max(id)+1 from #transid) 
begin 

DECLARE @TransID varchar(255) = (select transid from #transid where id = @counter) 

DECLARE @CustomerDB nvarchar(100) 
DECLARE @FullLength int 
DECLARE @TrimmedLength int 
CREATE TABLE #HGtmp (
HUGIdentity nvarchar(100)) 

DECLARE TBLCursor CURSOR FOR 
SELECT HoldGroupIdentity, SavesetIdentity FROM HoldSaveset 
OPEN TBLCursor 

DECLARE @HGIdentity int, @SSID int 
FETCH NEXT FROM TBLCursor INTO @HGIdentity, @SSID 
WHILE @@FETCH_STATUS = 0 
BEGIN 

IF @SSID = 
(SELECT SavesetIdentity FROM Saveset 
WHERE idTransaction = @transID) 
BEGIN 

DECLARE TBLCursor1 CURSOR FOR 
SELECT HoldGroupIdentity, HoldUserGroupID FROM HoldGroup 
OPEN TBLCursor1 
DECLARE @HGIdentity1 int, @HUGIdentity nvarchar(100) 

FETCH NEXT FROM TBLCursor1 INTO @HGIdentity1, @HUGIdentity 
WHILE @@FETCH_STATUS = 0 
BEGIN 

IF @HGIdentity = @HGIdentity1 
BEGIN 
SET @FullLength = (SELECT LEN(@HUGIdentity)) 
SET @TrimmedLength = (@FullLength - 40) 
SET @CustomerDB = SUBSTRING(@HUGIdentity, 4, @TrimmedLength) 
INSERT INTO #HGtmp (HUGIdentity) VALUES (@CustomerDB) 
END 

FETCH NEXT FROM TBLCursor1 INTO @HGIdentity1, @HUGIdentity 
END 
CLOSE TBLCursor1 
DEALLOCATE TBLCursor1 
END 
FETCH NEXT FROM TBLCursor INTO @HGIdentity, @SSID 
END 
SELECT DISTINCT HUGIdentity AS 'DA db with Legal Holds' FROM #HGtmp 

CLOSE TBLCursor 
DEALLOCATE TBLCursor 
DROP TABLE #HGtmp 

set @counter = @counter + 1 
end 

.

+0

감사합니다. 그게 첫 번째 부분을 해결하는 데 도움이되었지만이 스크립트에서 생성되는 다른 테이블에 두 번째 문제가 생겼습니다. 메시지 2714, 수준 16, 상태 6, 줄 2 이미 데이터베이스에 '#HGtmp'라는 개체가 있습니다. 스크립트 외부에서 HGtmp 테이블 생성을 시도하고 있는데 어떤 이유로 실행했을 때 오류가 발생했다는 메시지가 계속 표시됩니다. – Humble48

+0

코드를 수정 한 경우 OP를 업데이트하여 실행하려는 내용과 오류를 정확하게 표시 할 수 있습니까? – rwking

+0

사실, 나는 내가 방법을 알아 냈을지도 모른다라고 생각한다. 나는 스크립트의 일부가 아니기 때문에 #HGtmp에 대해 테이블을 추가 및 삭제하는 것뿐입니다. 나는 그것을 가지고 있다고 생각하지만 확인하는 데 두 시간을 준다. 다시 한 번 감사드립니다! – Humble48

관련 문제