每行的光标

Cursor for each row

我需要帮助。 插入新数据时我需要使用游标。现在,我设法通过匹配两个 table 来插入数据,匹配完成后,存储在变量中的两个值被插入到第三个 table.

唯一的问题是每一行都有相同的值,这是错误的。最终,我不知道为什么会发生这种情况,试图包括计数,更改应该首先发生的游标列表等。

Declare @Ugovor_ID varchar(50), 
        @Zupanija_ID varchar(50),
        @Broj_ugovora varchar(50),
        @Naziv_Zup varchar(50)

DECLARE cc CURSOR FOR SELECT Ug_zup.[Broj ugovora], Ug_zup.Zupanija FROM Ug_zup

OPEN cc
FETCH NEXT FROM cc into @Broj_ugovora, @Naziv_Zup 

WHILE @@FETCH_STATUS=0
BEGIN
SET @Ugovor_ID   = (SELECT Ugovor_ID FROM Ugovor WHERE "Broj_ugovora" = @Broj_ugovora)
SET @Zupanija_ID = (SELECT Zupanija_ID FROM Zupanija_Sif WHERE Zupanija_naziv = @Naziv_Zup)


INSERT INTO Ugovor_Zupanija (Ugovor_ID, Zupanija_ID)
SELECT @Ugovor_ID,@Zupanija_ID

FETCH NEXT FROM cc into @Ugovor_ID, @Zupanija_ID 
END
CLOSE cc
DEALLOCATE cc
GO

结果是这样的;

pic of the result

您的问题是,首先您获取了这两个变量:

FETCH NEXT FROM cc into @Broj_ugovora, @Naziv_Zup 

但是在你的循环中你获取了不同的变量:

FETCH NEXT FROM cc into @Ugovor_ID, @Zupanija_ID 

这意味着 @Broj_ugovora@Naziv_Zup 永远不会改变值。因为它们永远不会改变,所以这个赋值的结果也永远不会改变:

SET @Ugovor_ID   = (SELECT Ugovor_ID FROM Ugovor WHERE "Broj_ugovora" = @Broj_ugovora)
SET @Zupanija_ID = (SELECT Zupanija_ID FROM Zupanija_Sif WHERE Zupanija_naziv = @Naziv_Zup)

也永远不会改变,因此您一遍又一遍地插入相同的值。

快速解决方法是仅更改循环内的提取以匹配初始提取。

正确的解决方法是重写为基于集合的查询。我认为以下等同于您正在做的事情:

INSERT INTO Ugovor_Zupanija (Ugovor_ID, Zupanija_ID)
SELECT  u.Ugovor_ID,
        sif.Zupanija_ID
FROM    Ug_zup AS zup
        LEFT JOIN Zupanija_Sif AS sif
            ON sif.Zupanija_naziv = zup.Zupanija
        LEFT JOIN Ugovor AS u
            ON u.Broj_ugovora = zup.[Broj ugovora];