none
Возможно ли объединить INSERT и UPDATE в одном запросе? RRS feed

  • Вопрос

  • Добрый день всем! Дело в том что, мне надо загрузить данные в sql. У меня Insert получилось но при повторном запуске программы данные обратно загружается а надо UPDATE. Примерно попробовала сделать так:

    command.CommandText = "insert into dbf_records (kr, gos, np, razdel, dpens, summa, dvip, vidp)" + "Values (@kr, @gos, @np, @razdel, @dpens, @summa, @dvip, @vidp)" + "UPDATE dbf_records SET kr = @kr, gos = @gos, np = @np, razdel = @razdel, dpens = @dpens, summa = @summa, dvip = @dvip, vidp = @vidp " + "Where (kr = @kr, gos = @gos, np = @np, razdel = @razdel, dpens = @dpens, summa = @summa, dvip = @dvip, vidp = @vidp)";

    но выдает: Неправильный синтаксис около конструкции “,”.

Ответы

  • Нет нельзя если данные уникальны, т.е. нельзя их вставить дважды. Вам нужно разделить их. В первом только insert, а во второй update. Но если одновременно, то данные должны быть идентифицированы по первичному ключу, а увас всё подряд получается.

    Модератор
  • выдает: Неправильный синтаксис около конструкции “,”.

    Посмотрите в сторону оператора MERGE - http://technet.microsoft.com/en-us/library/bb510625.aspx он как раз объединяет в себе операторы INSERT/UPDATE/DELETE в зависимости от ваших условий,

    вот пример:

    --Для демнстрации тестовая таблица с 2-мя полями
    declare @t table ( a int, b char(5) );
    
    --Первый запуск...вставляем 3 записи
    merge @t t1
    using ( values ( 1, 'AAA01' )
                 , ( 2, 'BBB01' ) 
                 , ( 3, 'CCC01' ) 
          ) t2(a,b)
    on t1.a = t2.a
    when not matched then insert values (a,b)
    when matched then update set b = t2.b;
    --Смотрим, что в таблице
    select * from @t;
    
    
    --Второй запуск...вставляем 3 записи, при этом 2 из них уже есть в таблице 
    merge @t t1
    using ( values ( 1, 'AAA02' )
                 , ( 2, 'BBB02' ) 
                 , ( 4, 'DDD02' ) 
          ) t2(a,b)
    on t1.a = t2.a
    when not matched then insert values (a,b)
    when matched then update set b = t2.b;
    --Смотрим, что теперь у нас в таблице
    select * from @t
    
    

    Результат:


    http://www.t-sql.ru

    Модератор

Все ответы

  • Нет нельзя если данные уникальны, т.е. нельзя их вставить дважды. Вам нужно разделить их. В первом только insert, а во второй update. Но если одновременно, то данные должны быть идентифицированы по первичному ключу, а увас всё подряд получается.

    Модератор
  • выдает: Неправильный синтаксис около конструкции “,”.

    Посмотрите в сторону оператора MERGE - http://technet.microsoft.com/en-us/library/bb510625.aspx он как раз объединяет в себе операторы INSERT/UPDATE/DELETE в зависимости от ваших условий,

    вот пример:

    --Для демнстрации тестовая таблица с 2-мя полями
    declare @t table ( a int, b char(5) );
    
    --Первый запуск...вставляем 3 записи
    merge @t t1
    using ( values ( 1, 'AAA01' )
                 , ( 2, 'BBB01' ) 
                 , ( 3, 'CCC01' ) 
          ) t2(a,b)
    on t1.a = t2.a
    when not matched then insert values (a,b)
    when matched then update set b = t2.b;
    --Смотрим, что в таблице
    select * from @t;
    
    
    --Второй запуск...вставляем 3 записи, при этом 2 из них уже есть в таблице 
    merge @t t1
    using ( values ( 1, 'AAA02' )
                 , ( 2, 'BBB02' ) 
                 , ( 4, 'DDD02' ) 
          ) t2(a,b)
    on t1.a = t2.a
    when not matched then insert values (a,b)
    when matched then update set b = t2.b;
    --Смотрим, что теперь у нас в таблице
    select * from @t
    
    

    Результат:


    http://www.t-sql.ru

    Модератор