使用多个游标

时间:2019-10-17 05:48:19

标签: sql sql-server database

我想用另一个表中的值更新一个表。第一个表Tbl_test_details具有customer_idpr_notests以及更多的列,第二个表tbl_tests具有tests。对于pr_no中的每个tbl_test_details,我想添加teststbl_tests中的所有值。 我试图用游标做到这一点,但它不起作用。它仅插入第一个pr_no的记录并退出。需要帮助

更新:还有一个问题,重复pr_no tbl_test_deatils并且已经存在一些test值,因此某些插入可能由于主键而失败(pr_no + {{ 1}})

tests

3 个答案:

答案 0 :(得分:0)

请遵循以下网址:Using Spring Boot 2.0 with Tomcat 7.0.82

我认为这对您有帮助。

答案 1 :(得分:0)

您可以使用cursors编写查询以获取Cross Join,然后使用for each pr_no in tbl_test_details all the values in tests from tbl_testsExcept中插入新的不存在的记录,而不是使用tbl_test_details: / p>

insert into @Tbl_Test_details (pr_no,c_id,Tests)
select  TD.pr_no,
       TD.c_id,
       TS.Tests
from @Tbl_Test_details TD
cross Join @Tbl_Tests TS
except
select  TD.pr_no,
       TD.c_id,
       TD.Tests
from @Tbl_Test_details TD

sample code here..

答案 2 :(得分:0)

这不是一个完美的答案,它仍然存在性能问题,我仍然能够成功执行该操作。

DECLARE @cid int
DECLARE @tn int
DECLARE @prno nvarchar(50)
DECLARE @dte date
DECLARE @trn int
DECLARE @tst nvarchar(180)
DECLARE cr_testd CURSOR FOR
SELECT cust_id,pr_no,date 
FROM tbl_Test_Details;
DECLARE cr_tests CURSOR FOR
SELECT test_name 
FROM tbl_tests
DECLARE @trn=(select count(test_name) from tbl_tests)
OPEN cr_testd
FETCH NEXT FROM cr_testd into @cid,@prno,@dte
WHILE @@FETCH_STATUS = 0
BEGIN
    OPEN cr_tests
    FETCH NEXT FROM cr_tests into @tst
    WHILE @@FETCH_STATUS=0
    BEGIN
        BEGIN TRY
        SET @tn=(select count(*) from tbl_Test_Details where pr_no=@prno)
        IF(@tn = @trn)
        BEGIN           
            BREAK;
        END
        Insert into tbl_Test_Details values(@cid,@tst,0,0,@prno,@dte)
        END TRY

        BEGIN CATCH

        END CATCH
    FETCH NEXT FROM cr_tests into @tst
    END
    CLOSE cr_tests
FETCH NEXT FROM cr_testd into @cid,@prno,@dte
END
CLOSE cr_testd
DEALLOCATE cr_testd
DEALLOCATE cr_tests