在 sql 存储过程中循环并删除游标
loop in sql stored procedure and removing cursors
我必须修改某人编写的存储过程 else.Basically 存储过程使用游标从 table 获取数据,然后将该数据插入另一个 table.在从另一个 table 获取代码时,它还从另一个 table 获取一些不同的列下面是我的代码:
Declare data_cursor cursor for
Select emp_no, emp_name, event_date, Test_no, Code, Test_result
From test_table1
ORDER by emp_no
declare
@empNo varchar(100),
@emp_name varchar(2000),
@eventDate varchar(20),
@TestNo varchar(100),
@Code varchar(100),
@TestReuslt varchar(100),
@ProcessName varchar(100),
@FileProcess varchar(200),
@TestProcess varchar(100),
@countA int,
@error_count int
SELECT @ProcessName = (select distinct userID from test_table1)
SELECT @FileProcess = 'EW' + @ProcessName
Select @TestProcess = (Select distinct userID from test_Table1) + 'TXT'
select @countA = 0
BEGIN tran
OPEN data_cursor
fetch data_cursor into
@empNo ,
@emp_name ,
@eventDate ,
@TestNo ,
@Code ,
@TestReuslt
while (@@FETCH_STATUS=0)
begin
insert into TESTTable2
(
empNum, empName, eventDate,TestNum, Code, TestResult, Testprocess, ProcessName)
values (@empNo, @emp_name, @eventDate , @TestNo , @Code, @TestReuslt, @TestProcess, @ProcessName)
if @ ERROR > 0
begin
select @error_count = @error_count + 1
end
else
set @record_id = @@Identity
if @code like 'D%'
Insert into TESTTable3
(testProcess, FileProcess, empNum)
values (@TestProcess, @FileProcess, @empNo )
if @@error > 0
begin
select @error_count = @error_count + 1
end
set @countA = @countA + 1
fetch data_cursor into
fetch data_cursor into
@empNo ,
@emp_name ,
@eventDate ,
@TestNo ,
@Code ,
@TestReuslt
if @ ERROR > 0
BEGIN
select @error_count = @error_count + 1
end
end
if @error_count > 0
begin
rollback tran
end
else
begin /* @@error = 0 */
commit tran
close data_cursor
deallocate data_cursor
Insert into LOG_File
(Name, Count, Processname)
values ('Test1', @CountA,@ProcessName)
Select 'TotalCount' = @CountA
原因,我现在必须修改上面的存储过程是因为一些应用程序更改,我从 test_table1 获得大约 50 个不同的用户 ID,所以上面的子查询(SELECT @ProcessName = (select distinct userID from test_table1) 不起作用。我如何循环遍历上面的存储过程,以便每个 @ProcessName 都可以插入到 table TESTTable2 中,换句话说
我想一次传递每个 userId 并将其插入 table test_table1 和其他后续 table 中。我可以声明另一个游标来完成这个,但我想知道是否有更好的方法来重写这个存储过程并且根本不使用游标。
由于我的应用程序更改,以上所有这三个语句都抛出错误:
SELECT @ProcessName = (select distinct userID from test_table1)
SELECT @FileProcess = 'EW' + @ProcessName
Select @TestProcess = (Select distinct userID from testTable1) + 'TXT'
我正在使用 sql 服务器 2005。
任何帮助将不胜感激。
declare @countA int=0
begin tran
begin try
insert into TESTTable2(empNum, empName, eventDate,TestNum, Code, TestResult, Testprocess, ProcessName)
Select emp_no, emp_name, event_date, Test_no, Code, Test_result,userID+ 'TXT',userID
From test_table1
ORDER by emp_no
SET @CountA=@@ROWCOUNT
Insert into TESTTable3(testProcess, FileProcess, empNum)
Select userID+ 'TXT','EW' + userID,emp_no
From test_table1
Where code like 'D%'
ORDER by emp_no
commit tran
Insert into LOG_File(Name, Count, Processname) values ('Test1', @CountA,'@ProcessName')
end try
begin catch
rollback tran
SET @CountA =0
Insert into LOG_File(Name, Count, Processname) values ('Test1', @CountA,'@ProcessName')
SELECT ERROR_NUMBER() AS ErrorNumber,ERROR_MESSAGE() AS ErrorMessage
end catch
Select @CountA [TotalCount]
我必须修改某人编写的存储过程 else.Basically 存储过程使用游标从 table 获取数据,然后将该数据插入另一个 table.在从另一个 table 获取代码时,它还从另一个 table 获取一些不同的列下面是我的代码:
Declare data_cursor cursor for
Select emp_no, emp_name, event_date, Test_no, Code, Test_result
From test_table1
ORDER by emp_no
declare
@empNo varchar(100),
@emp_name varchar(2000),
@eventDate varchar(20),
@TestNo varchar(100),
@Code varchar(100),
@TestReuslt varchar(100),
@ProcessName varchar(100),
@FileProcess varchar(200),
@TestProcess varchar(100),
@countA int,
@error_count int
SELECT @ProcessName = (select distinct userID from test_table1)
SELECT @FileProcess = 'EW' + @ProcessName
Select @TestProcess = (Select distinct userID from test_Table1) + 'TXT'
select @countA = 0
BEGIN tran
OPEN data_cursor
fetch data_cursor into
@empNo ,
@emp_name ,
@eventDate ,
@TestNo ,
@Code ,
@TestReuslt
while (@@FETCH_STATUS=0)
begin
insert into TESTTable2
(
empNum, empName, eventDate,TestNum, Code, TestResult, Testprocess, ProcessName)
values (@empNo, @emp_name, @eventDate , @TestNo , @Code, @TestReuslt, @TestProcess, @ProcessName)
if @ ERROR > 0
begin
select @error_count = @error_count + 1
end
else
set @record_id = @@Identity
if @code like 'D%'
Insert into TESTTable3
(testProcess, FileProcess, empNum)
values (@TestProcess, @FileProcess, @empNo )
if @@error > 0
begin
select @error_count = @error_count + 1
end
set @countA = @countA + 1
fetch data_cursor into
fetch data_cursor into
@empNo ,
@emp_name ,
@eventDate ,
@TestNo ,
@Code ,
@TestReuslt
if @ ERROR > 0
BEGIN
select @error_count = @error_count + 1
end
end
if @error_count > 0
begin
rollback tran
end
else
begin /* @@error = 0 */
commit tran
close data_cursor
deallocate data_cursor
Insert into LOG_File
(Name, Count, Processname)
values ('Test1', @CountA,@ProcessName)
Select 'TotalCount' = @CountA
原因,我现在必须修改上面的存储过程是因为一些应用程序更改,我从 test_table1 获得大约 50 个不同的用户 ID,所以上面的子查询(SELECT @ProcessName = (select distinct userID from test_table1) 不起作用。我如何循环遍历上面的存储过程,以便每个 @ProcessName 都可以插入到 table TESTTable2 中,换句话说
我想一次传递每个 userId 并将其插入 table test_table1 和其他后续 table 中。我可以声明另一个游标来完成这个,但我想知道是否有更好的方法来重写这个存储过程并且根本不使用游标。
由于我的应用程序更改,以上所有这三个语句都抛出错误:
SELECT @ProcessName = (select distinct userID from test_table1)
SELECT @FileProcess = 'EW' + @ProcessName
Select @TestProcess = (Select distinct userID from testTable1) + 'TXT'
我正在使用 sql 服务器 2005。
任何帮助将不胜感激。
declare @countA int=0
begin tran
begin try
insert into TESTTable2(empNum, empName, eventDate,TestNum, Code, TestResult, Testprocess, ProcessName)
Select emp_no, emp_name, event_date, Test_no, Code, Test_result,userID+ 'TXT',userID
From test_table1
ORDER by emp_no
SET @CountA=@@ROWCOUNT
Insert into TESTTable3(testProcess, FileProcess, empNum)
Select userID+ 'TXT','EW' + userID,emp_no
From test_table1
Where code like 'D%'
ORDER by emp_no
commit tran
Insert into LOG_File(Name, Count, Processname) values ('Test1', @CountA,'@ProcessName')
end try
begin catch
rollback tran
SET @CountA =0
Insert into LOG_File(Name, Count, Processname) values ('Test1', @CountA,'@ProcessName')
SELECT ERROR_NUMBER() AS ErrorNumber,ERROR_MESSAGE() AS ErrorMessage
end catch
Select @CountA [TotalCount]