2011-09-07 22 views
10

olarak ayarlayın. Bir kaydın varlığını kontrol edecek bir saklı yordam yazmayı deniyorum ve eğer mevcut değilse SCOPE_IDENTITY döndüren bir eki yapın ve varsa nesne. Bu bilgiyi prosedürde edindikten sonra, onunla daha fazla işlem yapmam gerekiyor ve bir IF...ELSE bildiriminin içinden SCOPE_IDENTITY elde etmenin nasıl olacağından emin değilim.IF deyiminde SCOPE_IDENTITY değişkenini

Benim iki tablo:

CREATE TABLE [dbo].[ActionTable] (
    [ActionID] [int] IDENTITY(1, 1) NOT NULL, 
    [ObjectID] [int] NOT NULL, 
    [ActionName] [nvarchar](255) NOT NULL 
) 

CREATE TABLE [dbo].[ObjectTable] (
    [ObjectID] [int] IDENTITY(1, 1) NOT NULL, 
    [ObjectName] [nvarchar](255) NOT NULL 
) 

Saklı Prosedür:

CREATE PROCEDURE [dbo].[SetAction] 
    @ActionName [nvarchar](255), 
    @ObjectName [nvarchar](255) 
AS 
    DECLARE @ObjectID [int] 

    --I have tried the following 

    IF NOT EXISTS(SELECT ObjectID FROM ObjectTable WHERE ObjectName = @ObjectName) 
     INSERT INTO ObjectTable(ObjectName)VALUES(@ObjectName) 
     --Here I need to set @ObjectID = SELECT SCOPE_IDENTITY() 
    ELSE 
     SELECT @ObjectID = ObjectID FROM ObjectTable WHERE ObjectName = @ObjectName 

Bu Incorrect syntax near the keyword 'ELSE'

Bunun arama gerçekleştirmek için en iyi yöntem olacaktır döndürür/insert? Ben kimliği aldıktan sonra ben o zaman her zaman BEGIN kullanmalısınız

IF NOT EXISTS(SELECT ObjectID FROM ObjectTable WHERE ObjectName = @ObjectName) 
BEGIN 
     INSERT INTO ObjectTable(ObjectName)VALUES(@ObjectName) 
     SET @ObjectID = SCOPE_IDENTITY() 
END 
ELSE 
SELECT @ObjectID = ObjectID FROM ObjectTable WHERE ObjectName = @ObjectName 

cevap

22

yapacak deyim, daha sonra ifadeler eklediğinizde kodunuzun kırılmamasını sağlar.

IF ... 
BEGIN 
    ... statements 
END 
ELSE 
BEGIN 
    ... statements 
END 
4

bir hatta tek için/END END BEGIN gerekiyor için birden fazla şey varsa aşağıdaki

INSERT INTO ActionTable(ObjectID, ActionName) VALUES(@ObjectID, @ActionName) 

SELECT SCOPE_IDENTITY()