SQL Запрос Обновление уже существующей записи, если нет, то сделайте новую запись - PullRequest
1 голос
/ 26 февраля 2020

В настоящее время я работаю над обновлением уже существующей таблицы в базе данных моей компании. Соединение работает нормально, но мой запрос вызывает головную боль.

Что я хочу сделать: ведение журнала с 2 таблицами (Job-Table и Step-Table)

, поэтому я создал собственный PowerShell объект со всей необходимой информацией, которую я могу передать. Когда я начинаю запись в журнал, я создаю новую запись в Таблице заданий, в которой один столбец пуст / пуст (время окончания записи в журнал: имя столбца: остановка). После того, как я вошел в свой сценарий, я хочу добавить время окончания (к уже существующей записи в Таблице заданий).

Я знаю, что есть разные способы проверить, находитесь ли вы в начале или в конце задание ведения журнала, но я хочу сделать это с помощью Sql Query, поэтому я пришел к следующему утверждению SQL -Insert:

Begin 
    IF NOT EXISTS(Select * FROM job.table
                    WHERE JobId = @JobId)
        BEGIN
            INSERT INTO logg.Job (Module,JobId,ScriptId,Filepath,Start,Status,Stop,Infotext)
                Values(@Module,@JobId,@ScriptId,@Filepath,@Start,@Status,@Stop,@Infotext)
        END
    ELSE
        BEGIN
            INSERT INTO logg.Job(Stop)
                VALUES (@Stop)
                    WHERE( JobId = @JobId)
        END
END

Я почти уверен, что мне чего-то не хватает '; ' но все мои попытки и ошибки не привели меня к решению ...

По сути, я хочу проверить, есть ли запись в файле job.table с моим текущим идентификатором работы. Если нет, я запускаю новое задание регистрации и хочу вставить все имеющиеся значения. Если есть запись с идентификатором задания, я могу быть уверен (мой код, мой путь), что я хочу остановить задание регистрации и, следовательно, просто нужно обновить значение «Стоп» (время окончания).

Если Я использую более простые запросы, такие как:

INSERT INTO job.Table (Module,JobId,ScriptId,Filepath,Start,Status,Stop,Infotext)
    Values(@Module,@JobId,@ScriptId,@Filepath,@Start,@Status,@Stop,@Infotext)

Я получаю свои значения, как требуется, в БД, поэтому ошибки подключения и типа данных уже устранены.

Где мои ошибки синтаксиса? По моей IDE "около ГДЕ" ...

Ответы [ 2 ]

1 голос
/ 26 февраля 2020

Я буду обновлять этот ответ такими вещами, какими я их нахожу.

1.

Из чата с OP я узнал, что job.table на самом деле имя таблицы. Итак, это первая синтаксическая проблема.

Это должно быть

Select * FROM "job.table"
WHERE JobId = @JobId

, а не:

Select * FROM "job.table"
WHERE JobId = @JobId

2.

Это нехорошо:

INSERT INTO "job.table"(Stop)
VALUES (@Stop)
WHERE( JobId = @JobId)

Вы можете сделать:

INSERT INTO "job.table"(Stop)
VALUES (@Stop)

или использовать вставку в select, но вы должны описать мне, что вы хотите выбрать.

3.

Наконец, это должен быть ваш код:

Begin 
    IF NOT EXISTS(Select * FROM "job.table"
                    WHERE JobId = @JobId)
        BEGIN
            INSERT INTO logg.Job (Module,JobId,ScriptId,Filepath,Start,Status,Stop,Infotext)
                Values(@Module,@JobId,@ScriptId,@Filepath,@Start,@Status,@Stop,@Infotext)
        END
    ELSE
        BEGIN      
            INSERT INTO "job.table"(Stop)
            values  @Stop
        END
END;
0 голосов
/ 26 февраля 2020

Ваше условие if выглядит странно для меня (м.б., это только я), и если я считаю правильно, я пропускаю некоторые ")"

, вы можете попробовать это

 IF !EXISTS(Select * FROM job.table WHERE( JobId = @JobId))
...