2012-01-31 21 views
7

Sto cercando un modo più efficiente di completare questa attività. Devo impostare una variabile uguale a un ID se esiste, e se non la inserisco e quindi impostare la variabile sull'identità inserita. Posso fare questo nel modo seguente:SQL Server Imposta variabile se esiste altrimenti inserisce nella tabella

@VariableName --sent through to stored procedure 

DECLARE @VariableID [int] 

IF EXISTS(SELECT VariableID FROM VariableTable WHERE VariableName = @VariableName) 
    SET @VariableID = (SELECT VariableID FROM VariableTable WHERE VariableName = @VariableName) 
ELSE 
    INSERT INTO VariableTable(VariableName) VALUES(@VariableName) 
    SET @VariableID = SCOPE_IDENTITY(); 
END 

Tuttavia sembra inefficiente per eseguire la stessa query due volte (verificare se esiste e se non impostare la variabile)

Solo in cerca di suggerimenti su un modo migliore per realizzare questo compito.

risposta

14

Prova:

DECLARE @VariableID [int] 
SELECT @VariableID=VariableID FROM VariableTable WHERE VariableName = @VariableName 

IF @VariableID IS NULL 
BEGIN 
    INSERT INTO VariableTable(VariableName) VALUES(@VariableName) 
    SET @VariableID = SCOPE_IDENTITY(); 
END 
1

Prova questa:

INSERT INTO VariableTable (VariableID) 
SELECT SCOPE_IDENTITY() 
FROM VariableTable 
WHERE not exists 
(
SELECT VariableID FROM VariableTable WHERE VariableName = @VariableName 
) 

Quindi se avete bisogno di id si dovrà impostare la variabile @@ IDENTITY. Penso che questo sia il più efficiente in quanto non stai facendo una terza query, ma semplicemente ricevendo l'ultimo ID inserito.

1

ho provato questo frammento e viene eseguito correttamente:

DECLARE @VariableID [int] 
SET @VariableID=(SELECT VariableID FROM VariableTable WHERE VariableName = @VariableName) 
IF @VariableID IS NULL 
BEGIN 
    INSERT INTO VariableTable(VariableName) VALUES(@VariableName) 
    SET @VariableID = SCOPE_IDENTITY(); 
END 
+0

+1 per la sintassi SET, per ansi. – goodeye

1

Ecco una modifica lite per @Mithrandir risposta. Puoi usare TOP 1 che ti aiuta a velocizzare il risultato quando non stai confrontando con un campo unico. per esempio.

DECLARE @EXISTS AS BIT 
SET @EXISTS = 0 
SELECT TOP 1 @EXISTS = 1 FROM MyTable WHERE MyYear = @Year 
0

Prova questa divertente eccezione. Ricorda che non ci sono BEGIN e END, quindi la prossima dichiarazione dopo l'IF dovrebbe essere condizionata. Ora chiedetevi perché esiste la prima variabile:

declare @check binary 
declare @predeclared varchar(100) 
select @check = 0 

if @check = 1 
    declare @conditionaldeclare nvarchar(4000) 
    select @conditionaldeclare = 'conditionaldeclare' 
    print @conditionaldeclare 


if @check = 1 
    select @predeclared = 'predeclared' 
    print @predeclared 
Problemi correlati