Использование нескольких курсоров - PullRequest
0 голосов
/ 17 октября 2019

Я хочу обновить одну таблицу значениями из другой таблицы. первая таблица Tbl_test_details имеет customer_id, pr_no и tests и еще несколько столбцов, а вторая таблица tbl_tests имеет tests. для каждого pr_no в tbl_test_details я хочу добавить все значения в tests из tbl_tests. Я пытался сделать это с помощью курсоров, но это не работает. Он вставляет записи только для первых pr_no и завершает работу. Нужна помощь

Обновление: есть еще одна проблема: pr_no повторяется tbl_test_deatils, и некоторые значения test уже существуют, поэтому некоторая вставка может завершиться неудачно из-за первичного ключа (pr_no + tests)

   DECLARE @test nvarchar(180)
   DECLARE @prno nvarchar(50)
   DECLARE @dte date
   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
   OPEN cr_testd
   FETCH NEXT FROM cr_testd into @cid,@prno,@dte
   OPEN cr_tests
   WHILE @@FETCH_STATUS = 0
   BEGIN
       FETCH NEXT FROM cr_tests into @tst
       WHILE @@FETCH_STATUS=0
       BEGIN
           Insert into tbl_Test_Details values(@cid,@tst,@prno,@dte)
           IF (@@ROWCOUNT <= 0)
               BEGIN
                   BREAK
               END
       FETCH NEXT FROM cr_tests into @tst
       END
   FETCH NEXT FROM cr_tests into @tst
   END

   CLOSE cr_test
   DEALLOCATE cr_test```

Current State of Tables
Tbl_Test_details         Tbl_Tests
|--------------------|     |-----------|
|pr_no   c_id  Tests |     |  Tests    |
|--------------------|     |-----------|
|1        100   MDD  |     |  MDD      |
|1        100   FDT  |     |  FDT      | 
|2        101   DMC  |     |  DMC      |
                           |  CDD      |


Result Table
tbl_test_details
|--------------------|    
|pr_no   c_id  Tests |    
|--------------------|    
|1        100   MDD  |    
|1        100   FDT  |
|1        100   DMC  |
|1        100   CDD  |    
|2        101   MDD  | 
|2        101   FDT  | 
|2        101   DMC  | 
|2        101   CDD  | 


Ответы [ 3 ]

0 голосов
/ 17 октября 2019

Вместо использования cursors вы можете написать запрос, используя Cross Join для извлечения for each pr_no in tbl_test_details all the values in tests from tbl_tests и Except для вставки новых несуществующих записей в tbl_test_details как:

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

образец кода здесь ..

0 голосов
/ 17 октября 2019

Это не идеальный ответ, у него есть проблемы с производительностью, но я смог успешно выполнить операцию.

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
0 голосов
/ 17 октября 2019

, пожалуйста, следуйте этому URL: Обновление SQL одной таблицы на основе значений в курсоре другой таблицы

Я думаю, это поможет вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...