Как насчет этого ...
CREATE PROC TagMe(@TagName VARCHAR(100),@TaggedRecordId INT)
AS
DECLARE @TagId INT
SET @TagId = SELECT TagId FROM Tag WHERE TagName = @TagName
IF @TagId IS NOT NULL
BEGIN
--Tag exists
INSERT INTO TaggedRecords (TagId, TaggedRecordId) VALUES(@TagId,@TaggedRecordId)
RETURN
END
ELSE
-- New tag
BEGIN
INSERT INTO Tag (TagName) OUTPUT inserted.id INTO @TagId VALUES(@TagName)
INSERT INTO TaggedRecords (TagId, TaggedRecordId) VALUES(@TagId,@TaggedRecordId)
RETURN
END
Не проверено, но теория должна быть обоснованной:)
Еще один пример использования OUTPUT см. В моем сообщении по адресу по этой ссылке
EDIT
Согласно комментариям ниже эта версия использует EXISTS ...
CREATE PROC TagMe(@TagName VARCHAR(100),@TaggedRecordId INT)
AS
DECLARE @TagId INT
IF EXISTS(SELECT TagId FROM Tag WHERE TagName = @TagName)
BEGIN
--Tag exists
SET @TagId = SELECT TagId FROM Tag WHERE TagName = @TagName
INSERT INTO TaggedRecords (TagId, TaggedRecordId) VALUES(@TagId,@TaggedRecordId)
RETURN
END
ELSE
-- New tag
BEGIN
INSERT INTO Tag (TagName) OUTPUT inserted.id INTO @TagId VALUES(@TagName)
INSERT INTO TaggedRecords (TagId, TaggedRecordId) VALUES(@TagId,@TaggedRecordId)
RETURN
END
Хотя я не уверен (я полагаю, что я спорю против себя здесь, но большая часть этого материала - ответ "это зависит"!). Этот пример на самом деле будет работать лучше для большего использования новых тегов, потому что он будет выполнять EXISTS только один раз и затем продолжаться, тогда как для существующего тега он будет выполнять EXISTS, а затем SELECT.
Хм, выбирайте сами - или протестируйте оба подхода в объеме:)