Вставка строк в таблицу SQL в зависимости от того, какие результаты возвращает запрос

У меня есть несколько запросов, которые я использую, чтобы проверить, нет ли в результатах баз данных из тестов, которые я запускаю, ничего явно сломанного и ошибочного.

Один из запросов имеет следующую базовую форму:

SELECT *
FROM Table
WHERE Column = ''

Он проверяет, чтобы одно конкретное поле не было пустым. Я хочу следить за выполнением этих тестов и их прохождением или сбоем. Есть ли способ написать запрос, чтобы, если этот запрос вернул какие-либо результаты, он записал строку в другую таблицу, которая говорит что-то вроде «Тест пройден»?

Итак, псевдоверсия может выглядеть примерно так:

IF (
    SELECT *
    FROM Table1
    WHERE Table1.Column1 = ''
) = 0
INSERT INTO Table2 (FileName, Date, Result)
VALUES ('File1', 'GetDate()', 'Test Passed')
ELSE
INSERT INTO Table2 (FileName, Date, Result)
VALUES ('File1', 'GetDate()', 'Test Failed')

И таблица может выглядеть так:

| FileName |   Date   |    Result   |
|:--------:|:--------:|:-----------:|
| File1    | 12-25-16 | Test Passed |
| File2    | 12-25-16 | Test Failed |
| File3    | 12-25-16 | Test Passed |
| File4    | 12-25-16 | Test Passed |

person David    schedule 06.06.2016    source источник
comment
Просто измените SELECT * на SELECT COUNT(*) и все готово.   -  person Steve Mangiameli    schedule 06.06.2016


Ответы (3)


У вас почти есть это в вашем коде. Просто измените SELECT * на SELECT COUNT(*) и все готово. Я бы установил статус, а затем сделал вставку.

DECLARE @testStatus NVARCHAR(MAX);

IF (
    SELECT COUNT(*)
    FROM Table1
    WHERE Table1.Column1 = ''
) = 0
    SET @testStatus = 'Test Passed'
ELSE
    SET @testStatus = 'Test Failed'

INSERT INTO Table2 (FileName, Date, Result)
VALUES ('File1', GetDate(), @testStatus)
person Steve Mangiameli    schedule 06.06.2016
comment
Спасибо, Стив, у меня очень мало опыта работы с условными операторами в SQL, и я предполагал, что это должно быть намного сложнее, чем это. Я думаю, что собираюсь опубликовать новый вопрос об этом, потому что он выходит за рамки этого вопроса, но одна вещь, которую я не учел в исходном вопросе, заключалась в том, чтобы применить это к нескольким базам данных. - person David; 06.06.2016

Есть ли способ написать запрос, чтобы, если этот запрос вернул какие-либо результаты, он записал строку в другую таблицу, которая говорит что-то вроде «Тест пройден»?

Продолжая свой запрос, вы можете сделать что-то вроде ниже

--Нет столбцов, поэтому тест пройден

    IF not exists ( SELECT *
        FROM Table1
        WHERE Table1.Column1 = ''
    ) 
Begin
    INSERT INTO Table2 (FileName, Date, Result)
    VALUES ('File1', 'GetDate()', 'Test Passed')
End
person TheGameiswar    schedule 06.06.2016

Если вы хотите добиться результата только с помощью запроса (без T-SQL), вы можете использовать это решение:

INSERT INTO Table2(FileName, Date, Result)
  SELECT 'File1', GetDate(), X.Result FROM (
    SELECT 'Test passed' Result
       WHERE EXISTS(SELECT * FROM Table1 WHERE Column1 = '')
    UNION ALL      
    SELECT 'Test failed'
       WHERE NOT EXISTS (SELECT * FROM Table1 WHERE Column1 = '')
  ) X

Приложив немного усилий, вы можете написать версию того же запроса для Oracle:

INSERT INTO Table2(FileName, Date, Result)
  SELECT 'File1', sysdate, X.Result FROM (
    SELECT 'Test passed' Result FROM dual
       WHERE EXISTS(SELECT * FROM Table1 WHERE Column1 = '')
    UNION ALL      
    SELECT 'Test failed' FROM dual
       WHERE NOT EXISTS (SELECT * FROM Table1 WHERE Column1 = '')
  ) X
person Aris2World    schedule 06.06.2016