iT邦幫忙

0

用Cursor逐筆跑資料並依照條件紀錄資料於暫存表

以下是自己嘗試撰寫的Cursor範例程式,我想依據條件將每一筆結果放在@tempTable中,或只是印出一行字,最後select出來,請問要怎麼改寫這邊的程式碼呢?

create table [dbo].[tableA](
	FieldName1 nvarchar(4000) not null,
	FieldName2 nvarchar(4000) not null,
	FieldName3 nvarchar(4000) not null,
	FieldName4 nvarchar(4000) not null,
	FieldName5 bit not null,
	FieldName6 bit not null
) 

set nocount on

--定義存放的變數
declare @no nvarchar(4000)

--@tempTable放結果  
--模擬實際table的欄位長相
declare @tempTable table (
    FieldName1 nvarchar(4000)
    , FieldName2 nvarchar(4000)
    , FieldName3 nvarchar(4000)
    , FieldName4 nvarchar(4000)
    , FieldName5 bit
    , FieldName6 nvarchar(4000) bit)

--定義Cursor,並打開
declare myCursor cursor for

--資料集
select * from TableA

--開啟游標
open myCursor

--查看總筆數
print @@cursor_rows 

--迴圈跑Cursor
fetch next from myCursor into 
	@FieldName1,
	@FieldName2,
	@FieldName3,
	@FieldName4,
	@FieldName5,
	@FieldName6
while(@@fetch_status <> -1)
begin
		if @FieldName5 = 0 
		begin
			--這邊想要把找出來的資料丟到暫存Table
		end
		else
		begin
			print 'insert...'
		end
--抓下一筆
fetch next from myCursor into 
	@FieldName1,
	@FieldName2,
	@FieldName3,
	@FieldName4,
	@FieldName5,
	@FieldName6
end

--關閉與釋放Cursor
close myCursor 
deallocate myCursor

1 個回答

0
暐翰
iT邦大師 1 級 ‧ 2019-03-27 11:53:17
最佳解答

線上測試連結 db<>fiddle

create table [dbo].[tableA](
	FieldName1 nvarchar(4000) not null,
	FieldName2 nvarchar(4000) not null,
	FieldName3 nvarchar(4000) not null,
	FieldName4 nvarchar(4000) not null,
	FieldName5 bit not null,
	FieldName6 bit not null
) 

insert into tableA (FieldName1,FieldName2,FieldName3,FieldName4,FieldName5,FieldName6)values ('test','test','test','test',0,1);
insert into tableA (FieldName1,FieldName2,FieldName3,FieldName4,FieldName5,FieldName6) values ('test','test','test','test',1,1);

set nocount on

--定義存放的變數
declare @no nvarchar(4000)

--@tempTable放結果  
--模擬實際table的欄位長相
declare @tempTable table (
    FieldName1 nvarchar(4000)
    , FieldName2 nvarchar(4000)
    , FieldName3 nvarchar(4000)
    , FieldName4 nvarchar(4000)
    , FieldName5 bit
    , FieldName6 bit)

--定義Cursor,並打開
declare myCursor cursor for

--資料集
select * from TableA

--開啟游標
open myCursor

--查看總筆數
print @@cursor_rows 

--迴圈跑Cursor
declare     @FieldName1 nvarchar(4000)
    , @FieldName2 nvarchar(4000)
    , @FieldName3 nvarchar(4000)
    , @FieldName4 nvarchar(4000)
    , @FieldName5 bit
    , @FieldName6 bit;
fetch next from myCursor into 
	@FieldName1,
	@FieldName2,
	@FieldName3,
	@FieldName4,
	@FieldName5,
	@FieldName6
while(@@fetch_status <> -1)
begin
		if @FieldName5 = 0 
		begin
			--這邊想要把找出來的資料丟到暫存Table
			insert into @tempTable (FieldName1,FieldName2,FieldName3
				,FieldName4,FieldName5,FieldName6)
			values (@FieldName1,@FieldName2,@FieldName3
				,@FieldName4,@FieldName5,@FieldName6);
		end
		else
		begin
			print 'insert...'
		end
--抓下一筆
fetch next from myCursor into 
	@FieldName1,
	@FieldName2,
	@FieldName3,
	@FieldName4,
	@FieldName5,
	@FieldName6
end

--關閉與釋放Cursor
close myCursor 
deallocate myCursor

--最後查詢暫存表 
select * from @tempTable;

我要發表回答

立即登入回答