Если нет другой логики, которая зависит от того, существует строка или нет, почему бы не превратить ее в хранимую процедуру, которая выполняет INSERT, если она присутствует, или UPDATE, если ее нет? Затем верните идентификатор в любом случае.
Если вы используете SQL Server 2008, это прекрасная возможность использовать оператор MERGE .
Вот пример хранимой процедуры, использующей инструкцию MERGE, которая будет "upsert", измененная с этого примера .
CREATE PROC dbo.usp_VendorUpsert
(
@stringID INT OUTPUT,
@stringValue VARCHAR(80)
)
AS
BEGIN
SET NOCOUNT ON;
MERGE dbo.Errors as target
USING (SELECT @stringValue) AS source(ErrorString)
ON target.ErrorString = source.ErrorString
WHEN NOT MATCHED THEN
INSERT (ErrorString) VALUES (@stringValue)
WHEN MATCHED THEN
UPDATE SET @stringID = id;
// Get the id from the insert or the update.
SET @stringID = COALESCE(SCOPE_IDENTITY(), @stringID);
END
RETURN