Вставка SQL, если запись еще не существует, вставки в любом случае - PullRequest
0 голосов
/ 29 ноября 2018

Я пытаюсь сделать оператор INSERT, подобный приведенному здесь: docs.microsoft

Мой оператор SQL выглядит так:

INSERT INTO dbo.Table1([Name], [Value], [Period], [As of Date])
    VALUES ('Cust Index', -10.75468724987, '1M', '2018-10-31')
    SELECT 'Cust Index', -10.75468724987, '1M', '2018-10-31' 
        WHERE NOT EXISTS (SELECT [Name], [Period], [As of Date] FROM Table1
                            WHERE [Name] = 'Cust Index' AND [Period] = '1M' )

Iне могу понять, что я делаю неправильно, так как это все еще обновляет table1, даже если значения существуют.Я исключаю поле [Значение] из моего сравнения, потому что оно пересчитывается каждый раз, когда я запускаю свою функцию, и я хочу убедиться, что оно не вставляется в мою таблицу только потому, что оно отключено на несколько знаков после запятой.

Может быть, ответ прост, и мне просто нужен второй взгляд, чтобы увидеть мое заявление sql, потому что на данный момент я застрял.

1 Ответ

0 голосов
/ 29 ноября 2018

Попробуйте эту версию:

INSERT INTO dbo.Table1([Name], [Value], [Period], [As of Date])
    SELECT v.*
    FROM (VALUES ('Cust Index', -10.75468724987, '1M', '2018-10-31')
         ) v(Name, Value, Period, AsOfDate)
    WHERE NOT EXISTS (SELECT 1
                      FROM Table1 t1
                      WHERE t1.Name = v.name AND t1.Period = v.Period
                     );

Это позволяет избежать повторения всех значений столбца.

Обратите внимание, что лучший способ обеспечить отсутствие дублирования данных - это использовать уникальное ограничение илииндекс:

create unique index unq_table1_name_period on table1(name, period);
...