1

このクエリが何を達成するのか理解できません:

DECLARE @CatalogID int
INSERT [Catalog] ([Name])
SELECT @Catalog WHERE NOT EXISTS (SELECT [Name] FROM [Catalog] WHERE [Name] = @Catalog)
SELECT @CatalogID = ID FROM [Catalog] WHERE [Name] = @Catalog

スキーマは、catalogue、data entry、dataentryversion、tags、users の 5 つのテーブルで構成されます

4

1 に答える 1

2

基本的に、レコードがまだ存在しない場合は挿入し、挿入された、または既に存在するレコードの ID を返します。

以下のコードにコメントを追加しました。

DECLARE @CatalogID int --Create a variable to hold the Catalog id 
INSERT [Catalog] ([Name]) --Inserting into the catalog table
SELECT @Catalog --The SELECT will only return a value if a matching record does not exist
WHERE NOT EXISTS (SELECT [Name] FROM [Catalog] WHERE [Name] = @Catalog) 

SELECT @CatalogID = ID FROM [Catalog] WHERE [Name] = @Catalog --Returns the ID of the catalog record

価値のあることとして、このクエリを逆に書くこともできます。つまり、一致するレコードを選択し、catalog何も返されない場合は挿入を実行しますが、このアプローチは「競合状態」に対して脆弱ではないという点で優れています2 つのプロセスが同時に同じレコードを挿入しようとしている可能性があります。

于 2012-05-13T20:56:08.583 に答える