2010-06-28 4 views
1

Я вставляю строки в SQL Server 2005 из PowerShell. Мне нужно добавить предложение WHERE NOT EXISTS в мой код, чтобы остановить вставку дубликатов. Я тестирую код SQL в SSMS и не могу заставить его работать.Помогите создать инструкцию INSERT INTO

Где ошибка в следующем коде?

INSERT INTO dbo.PrptyValSrce 
    (PrptySrceName, PrptyNameSrce, PrptyValSrce, PrptyTS) 
VALUES 
    (@property, @propertyDesc, @value, @Timestamp) 
WHERE NOT EXISTS 
(SELECT * from PrptyValSrce as b 
WHERE b.Seqno 
AND b.PrptySrceName = @property 
AND b.PrptyNameSrce = @propertyDesc 
AND b.PrptyValSrce = @value 
AND b.PrptyTS = @Timestamp); 
+1

Что такое сообщение об ошибке? – amelvin

ответ

1

Ваш синтаксис является недопустимым - вы не можете иметь пункт WHERE применяется к VALUES. Попробуйте это:

IF NOT EXISTS(
    SELECT * 
    from PrptyValSrce as b 
    WHERE b.Seqno 
     AND b.PrptySrceName = @property 
     AND b.PrptyNameSrce = @propertyDesc 
     AND b.PrptyValSrce = @value 
     AND b.PrptyTS = @Timestamp) 
    BEGIN 
     INSERT INTO dbo.PrptyValSrce 
     (PrptySrceName, PrptyNameSrce, PrptyValSrce, PrptyTS) 
     VALUES 
     (@property, @propertyDesc, @value, @Timestamp) 
    END 
+0

darn - избили меня на 13 секунд .... но что BEGIN ... END пара действительно не нужна ... (просто быть nit-picky ) –

+0

Большое спасибо, не мог понять, почему выбор .. где не работает, а вставка в ... не – Andrew

1

Вы не можете сделать INSERT....VALUES и добавить пункт WHERE к этому. Если вы делаете INSERT...VALUES, эти значения вставляются - период.

Вы должны изменить вокруг, как вы делаете чек:

IF NOT EXISTS((SELECT * from PrptyValSrce as b 
WHERE b.Seqno 
AND b.PrptySrceName = @property 
AND b.PrptyNameSrce = @propertyDesc 
AND b.PrptyValSrce = @value 
AND b.PrptyTS = @Timestamp) 
    INSERT INTO dbo.PrptyValSrce 
     (PrptySrceName, PrptyNameSrce, PrptyValSrce, PrptyTS) 
    VALUES 
     (@property, @propertyDesc, @value, @Timestamp) 

IF NOT EXISTS Выполните проверку, и если это удастся, то делать вам INSERT....VALUES.

1

Вы также могли бы сделать

INSERT INTO dbo.PrptyValSrce 
    (PrptySrceName, PrptyNameSrce, PrptyValSrce, PrptyTS) 
SELECT @property, @propertyDesc, @value, @Timestamp 
WHERE NOT EXISTS 
(SELECT * from PrptyValSrce as b 
WHERE b.Seqno 
AND b.PrptySrceName = @property 
AND b.PrptyNameSrce = @propertyDesc 
AND b.PrptyValSrce = @value 
AND b.PrptyTS = @Timestamp);