ฉันจะวนซ้ำชุดระเบียนจากตัวเลือกได้อย่างไร
ตัวอย่างเช่นฉันมีบางระเบียนที่ฉันต้องการวนซ้ำและทำบางสิ่งกับแต่ละระเบียน นี่เป็นเวอร์ชั่นดั้งเดิมของการเลือกของฉัน:
select top 1000 * from dbo.table
where StatusID = 7
ขอบคุณ
ฉันจะวนซ้ำชุดระเบียนจากตัวเลือกได้อย่างไร
ตัวอย่างเช่นฉันมีบางระเบียนที่ฉันต้องการวนซ้ำและทำบางสิ่งกับแต่ละระเบียน นี่เป็นเวอร์ชั่นดั้งเดิมของการเลือกของฉัน:
select top 1000 * from dbo.table
where StatusID = 7
ขอบคุณ
คำตอบ:
โดยใช้ T-SQL และเคอร์เซอร์เช่นนี้
DECLARE @MyCursor CURSOR;
DECLARE @MyField YourFieldDataType;
BEGIN
SET @MyCursor = CURSOR FOR
select top 1000 YourField from dbo.table
where StatusID = 7
OPEN @MyCursor
FETCH NEXT FROM @MyCursor
INTO @MyField
WHILE @@FETCH_STATUS = 0
BEGIN
/*
YOUR ALGORITHM GOES HERE
*/
FETCH NEXT FROM @MyCursor
INTO @MyField
END;
CLOSE @MyCursor ;
DEALLOCATE @MyCursor;
END;
นี่คือสิ่งที่ฉันได้ทำถ้าคุณต้องการทำอะไรซ้ำ ๆ ... แต่ก็ควรที่จะมองหาชุดปฏิบัติการก่อน
select top 1000 TableID
into #ControlTable
from dbo.table
where StatusID = 7
declare @TableID int
while exists (select * from #ControlTable)
begin
select top 1 @TableID = TableID
from #ControlTable
order by TableID asc
-- Do something with your TableID
delete #ControlTable
where TableID = @TableID
end
drop table #ControlTable
เปลี่ยนเป็นคำตอบของ sam yi เล็กน้อย (เพื่อให้อ่านง่ายขึ้น):
select top 1000 TableID
into #ControlTable
from dbo.table
where StatusID = 7
declare @TableID int
while exists (select * from #ControlTable)
begin
select @TableID = (select top 1 TableID
from #ControlTable
order by TableID asc)
-- Do something with your TableID
delete #ControlTable
where TableID = @TableID
end
drop table #ControlTable
select @TableID = (...)
คำสั่ง
ด้วยการใช้เคอร์เซอร์คุณสามารถวนซ้ำระเบียนแต่ละรายการและพิมพ์บันทึกแยกต่างหากหรือเป็นข้อความเดียวรวมถึงระเบียนทั้งหมด
DECLARE @CustomerID as INT;
declare @msg varchar(max)
DECLARE @BusinessCursor as CURSOR;
SET @BusinessCursor = CURSOR FOR
SELECT CustomerID FROM Customer WHERE CustomerID IN ('3908745','3911122','3911128','3911421')
OPEN @BusinessCursor;
FETCH NEXT FROM @BusinessCursor INTO @CustomerID;
WHILE @@FETCH_STATUS = 0
BEGIN
SET @msg = '{
"CustomerID": "'+CONVERT(varchar(10), @CustomerID)+'",
"Customer": {
"LastName": "LastName-'+CONVERT(varchar(10), @CustomerID) +'",
"FirstName": "FirstName-'+CONVERT(varchar(10), @CustomerID)+'",
}
}|'
print @msg
FETCH NEXT FROM @BusinessCursor INTO @CustomerID;
END
เป็นอีกแนวทางหนึ่งถ้าคุณใช้เทมเพลตดีฉันได้ทำการทดสอบเป็นการส่วนตัวและจะไม่ทำให้เกิดข้อยกเว้นใด ๆ (แม้ว่าตารางเทมเพลตจะไม่มีข้อมูลใด ๆ )
CREATE TABLE #TempTable
(
ROWID int identity(1,1) primary key,
HIERARCHY_ID_TO_UPDATE int,
)
--create some testing data
--INSERT INTO #TempTable VALUES(1)
--INSERT INTO #TempTable VALUES(2)
--INSERT INTO #TempTable VALUES(4)
--INSERT INTO #TempTable VALUES(6)
--INSERT INTO #TempTable VALUES(8)
DECLARE @MAXID INT, @Counter INT
SET @COUNTER = 1
SELECT @MAXID = COUNT(*) FROM #TempTable
WHILE (@COUNTER <= @MAXID)
BEGIN
--DO THE PROCESSING HERE
SELECT @HIERARCHY_ID_TO_UPDATE = PT.HIERARCHY_ID_TO_UPDATE
FROM #TempTable AS PT
WHERE ROWID = @COUNTER
SET @COUNTER = @COUNTER + 1
END
IF (OBJECT_ID('tempdb..#TempTable') IS NOT NULL)
BEGIN
DROP TABLE #TempTable
END
COUNT(*)
และที่สองไปจากCOUNT(*)
1 ถึงแปลก
WHILE (@COUTNER <= @ROWID)
และคุณไม่จำเป็นต้องลดค่าลง@ROWID
ในการทำซ้ำแต่ละครั้ง BTW จะเกิดอะไรขึ้นถ้าROWID
s ในตารางของคุณไม่ต่อเนื่อง (บางแถวถูกลบไปก่อนหน้านี้)
คุณสามารถเลือกที่จะจัดอันดับข้อมูลของคุณและเพิ่ม ROW_NUMBER และนับลงไปที่ศูนย์ในขณะที่ทำซ้ำชุดข้อมูลของคุณ
-- Get your dataset and rank your dataset by adding a new row_number
SELECT TOP 1000 A.*, ROW_NUMBER() OVER(ORDER BY A.ID DESC) AS ROW
INTO #TEMPTABLE
FROM DBO.TABLE AS A
WHERE STATUSID = 7;
--Find the highest number to start with
DECLARE @COUNTER INT = (SELECT MAX(ROW) FROM #TEMPTABLE);
DECLARE @ROW INT;
-- Loop true your data until you hit 0
WHILE (@COUNTER != 0)
BEGIN
SELECT @ROW = ROW
FROM #TEMPTABLE
WHERE ROW = @COUNTER
ORDER BY ROW DESC
--DO SOMTHING COOL
-- SET your counter to -1
SET @COUNTER = @ROW -1
END
DROP TABLE #TEMPTABLE
ด้วยวิธีนี้เราสามารถทำซ้ำในข้อมูลตาราง
DECLARE @_MinJobID INT
DECLARE @_MaxJobID INT
CREATE TABLE #Temp (JobID INT)
INSERT INTO #Temp SELECT * FROM DBO.STRINGTOTABLE(@JobID,',')
SELECT @_MinJID = MIN(JobID),@_MaxJID = MAX(JobID) FROM #Temp
WHILE @_MinJID <= @_MaxJID
BEGIN
INSERT INTO Mytable
(
JobID,
)
VALUES
(
@_MinJobID,
)
SET @_MinJID = @_MinJID + 1;
END
DROP TABLE #Temp
STRINGTOTABLEเป็นฟังก์ชั่นกำหนดผู้ใช้ซึ่งจะแยกวิเคราะห์ข้อมูลที่คั่นด้วยเครื่องหมายจุลภาคและส่งคืน ขอบคุณ
ฉันคิดว่านี่เป็นตัวอย่างวิธีง่าย ๆ ในการวนซ้ำรายการ
declare @cateid int
select CateID into [#TempTable] from Category where GroupID = 'STOCKLIST'
while (select count(*) from #TempTable) > 0
begin
select top 1 @cateid = CateID from #TempTable
print(@cateid)
--DO SOMETHING HERE
delete #TempTable where CateID = @cateid
end
drop table #TempTable