每行的光标
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];
我需要帮助。 插入新数据时我需要使用游标。现在,我设法通过匹配两个 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];