使用不同的值多次运行SQL查询

时间:2014-12-10 17:08:31

标签: sql-server sql-server-2008

我收到了一个SQL脚本,我需要使用不同的TransID值多次运行。我有20,000个TransID,我需要运行它,所以我认为我需要将20,00个TransID放在另一个表中,然后使用CURSOR一次读取一个值,然后运行整个查询。冲洗并重复。我不确定如何将其用于此脚本以及如何处理输出,因为我可以获得每个值的多个输出。我可以不放弃桌子并在最后继续添加它吗?

感谢您的帮助。我对此非常环保。这是我给出的剧本:

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

1 个答案:

答案 0 :(得分:0)

我会将TransID放入带有标识列的临时表中。例如,您可以将它们插入临时表:#TransID

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

将您的TransID插入此表,您将获得每个TransID。然后使用WHILE语句包装代码,如下所示:

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

这应该为您插入临时表的每个TransID循环一次代码。