2012-02-06 14 views
6

Sto tentando di immettere valori nella tabella in modo programmatico.inserire nei valori con clausola where

Non riesco a utilizzare una scala Selezionare @ variabili. Devo usare la parola chiave Valori.

Come è possibile creare una clausola where quando si utilizzano Valori nell'inserto in.

Sto cercando di evitare duplicati

DECLARE @MyID INT 
    DECLARE @Phone varchar(10) 
    DECLARE @MyDATE DateTime 
    DECLARE @Agent as varchar(50) 
    DECLARE @Charge as varchar(50) 
    DECLARE @Vendor as varchar(50) 

    SET @MyID = 215199999 
    SET @Phone = '9999999999' 
    SET @MyDATE = '2010-12-04 11:56:12.000' 
    SET @Agent = 'fbrown' 
    SET @Charge = 'NO' 
    SET @Vendor = 'NO' 

    INSERT INTO [MyDB].[dbo].[Accounts] 
    (MyID,Phone,MyDate,Agent,Charge,Vendor) 
    VALUES (
    @MyID 
    ,@Phone 
    ,@MyDATE 
    ,@Agent 
    ,@Charge 
    ,@Vendor 
) WHERE MyID NOT IN (@MyID) 
+0

Perché dovresti usare una clausola where su un inserto? Stai effettivamente cercando di inserire non duplicati? –

+0

Sì. Cercando di evitare i duplicati –

+0

Non è un concetto. Se si selezionano dati da un'altra query, una clausola 'WHERE' ha senso sull'origine dati. – HABO

risposta

22
IF NOT EXISTS(SELECT 1 FROM [MyDB].[dbo].[Accounts] WHERE MyID = @MyID) 
    INSERT INTO [MyDB].[dbo].[Accounts] 
     (MyID, Phone, MyDate, Agent, Charge, Vendor) 
     VALUES 
     (@MyID, @Phone, @MyDATE, @Agent, @Charge, @Vendor) 
1

Se si sta tentando di fare in modo che la colonna MyID non contiene duplicati, di avere almeno 3 scelte: 1) rendere il colonna univoca (creare un indice su quella colonna e dichiararla come unica, o, meglio ancora, una chiave primaria) 2) rendere l'incremento automatico della colonna. In questo modo, non è nemmeno necessario assegnare valori ad esso. 4) puoi usare la soluzione di Joe Stefanelli (su questo thread). È programmabile e ti consente di assegnare qualsiasi valore desiderato.

3

Provare a utilizzare

if not exists (select top 1 * from [MyDB].[dbo].[Accounts] Where MyID = @MyID) 
INSERT INTO [MyDB].[dbo].[Accounts] 
    (MyID,Phone,MyDate,Agent,Charge,Vendor) 
    VALUES (
    @MyID 
    ,@Phone 
    ,@MyDATE 
    ,@Agent 
    ,@Charge 
    ,@Vendor 
) 
+2

Questo è un duplicato di http://stackoverflow.com/a/9166197/496972 –

+0

sì, hai ragione, non ho visto la risposta di joe mentre stavo postando .. –

+0

Se davvero voglio cancellare il mio post, basta aggiornare così posso cancellare il mio post –

0

anche l'opzione di unione (UPSERT) è una buona opzione per una singola esecuzione. in questo esempio, quando la corrispondenza non è stata completata, ma è possibile aggiungere l'istruzione WHEN corrispondente e aggiornare data/ora o contatori.

MERGE 
    Accounts AS target 
USING 
(select @MyID as myID) AS source 
ON 
    target.myID = source.myID 

WHEN NOT MATCHED THEN 
INSERT (MyID,Phone,MyDate,Agent,Charge,Vendor) 
    VALUES (
    @MyID 
    ,@Phone 
    ,@MyDATE 
    ,@Agent 
    ,@Charge 
    ,@Vendor 
); 
+0

Ps Questo argomento ha 4,5 anni. :-) – Tenzin

+4

@Tenzin E allora? Ciò non significa che le persone non cercano più risposte per la stessa domanda – DixonD