「voorwerpnummer」列に主キー違反があります。重複値は1ですが、関数は決して同じ数を2回与えてはいけません。 'Voorwerp'テーブルに何も置かずに関数をテストしようとすると、それは1を返し、 'Voorwerp'テーブルの1つの行でテストすると2を返します。それはすべきです。なぜこの挿入クエリ内で1が2回返されますか?私はSQL Server 2016を使用しています。このSQL関数がinsert文内で異なる動作をするのはなぜですか?
-- Empty tables
DELETE
FROM Bestand
DELETE
FROM Voorwerp_in_rubriek
DELETE
FROM Voorwerp
-- Delete function if exists
IF EXISTS (SELECT *
FROM sys.objects
WHERE object_id = OBJECT_ID(N'[dbo].[GetVoorwerpnummer]')
AND type IN (N'FN', N'IF', N'TF', N'FS', N'FT'))
DROP FUNCTION [dbo].[GetVoorwerpnummer]
GO
-- Returns the next item number
CREATE FUNCTION dbo.GetVoorwerpnummer()
RETURNS INTEGER
AS BEGIN
DECLARE @Highest INTEGER
-- Find the highest number
SET @Highest = (SELECT TOP 1 voorwerpnummer FROM EenmaalAndermaal.dbo.Voorwerp ORDER BY voorwerpnummer DESC)
-- Take 0 if there is none
SET @Highest = ISNULL(@Highest, 0)
-- Add 1
SET @Highest = (@Highest + 1);
RETURN @Highest
END
GO
INSERT INTO EenmaalAndermaal.dbo.Voorwerp (looptijd, looptijdbegin, startprijs, verzendkosten, verkoopprijs, beschrijving, betalingsinstructie, betalingswijzenaam, landnaam, plaatsnaam, titel, verzendinstructies, voorwerpnummer, wel_niet_indicator, verkoper, koper)
SELECT
10 AS looptijd,
GETDATE() AS looptijdbegin,
LEFT(Prijs,8) AS startprijs,
'1,20' AS verzendkosten,
NULL AS verkoopprijs,
'Beschrijving van product' AS beschrijving,
NULL AS betalingsinstructie,
'paypal' AS betalingswijzenaam,
LEFT(land,40) AS landnaam,
LEFT(Locatie,40) AS plaatsnaam,
LEFT(Titel,40) AS titel,
NULL AS verzendinstructies,
dbo.GetVoorwerpnummer() AS voorwerpnummer,
0 AS wel_niet_indicator,
LEFT(Verkoper, 40) AS Verkoper,
NULL AS koper
FROM EBAY.dbo.Items
一度にセット(複数のレコード)ではなく、単一のレコードを挿入した場合はどうなりますか?例えば: 'INSERT INTO tmp.PK_Test \t SELECT \tはdbo.F_PK_Test()、 '' そして、それが壊れるT ' – HoneyBadger
AS \t INFORMATION_SCHEMA.TABLES FROM \t、私はそれ集合演算作るものの部分から逃しました。完全に私の悪い。ユニークなシーケンシャル番号を手動で管理するのではなく、IDENTITYを使用しないでください。 – Stilgar
私はそれについて考えましたが、可能であればテーブルに何も変更を加えないでください。 – Skere