2012-05-13 3 views
1

У меня возникли проблемы с пониманием того, что этот запрос выполняет:Что делает этот SQL-запрос?

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 

Схема состоит из пяти таблиц каталога, ввода данных, dataentryversion, теги, пользователи

ответ

2

В основном вы вставляя запись, если она Безразлично 't уже существует и затем возвращает идентификатор записи, которая была либо вставлена, либо уже была там.

Я добавил комментарии к ниже код:

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 и если ничего не возвращенный затем выполнение вставки, но этот подход превосходит то, что он не уязвим для «состояния гонки», когда два процесса могут пытаться вставить одну и ту же запись одновременно.

+0

спасибо, спасибо за помощь, вы подключили точки для меня !!!! – user8189

+0

Вы должны отметить его ответ как правильный ответ. –

+0

yaeh почему бы и нет !!! , я бы с удовольствием, но как вы отмечаете ответ как правильный ответ? простите меня, но я добрая к этому техническому форуму, появилась кнопка внизу, с текстом, спрашивающим «был ли этот пост полезен для вас», я уже щелкнул его, !!! ???? – user8189