2016-06-06 5 views
0

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

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

SELECT * 
FROM Table 
WHERE Column = '' 

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

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

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 | 
+0

Просто измените 'SELECT *' в 'SELECT COUNT (*)', и вы получите его –

ответ

4

Вы почти иметь его в своем коде. Просто измените 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) 
+0

Спасибо Стив, у меня очень мало опыта работы с условными операторами в SQL, и я предположил, что это было будет намного сложнее этого. Я думаю, что я собираюсь опубликовать новый вопрос об этом, потому что это выходит за рамки этого вопроса, но одна вещь, которую я упустил из первоначального вопроса, заключалась в том, что это применимо к нескольким базам данных. – David

0

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

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

--no колонны так тест прошел

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

Если вы хотите, чтобы достичь результата только с помощью запроса (без Т -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 
0
MERGE 
    table2 AS target 
USING 
    table1 AS source 
ON 
    source.Column1 = '' 
WHEN MATCHED THEN 
    INSERT INTO target (FileName, Date, Result) 
    VALUES ('File1', 'GetDate()', 'Test Failed') 
WHEN NOT MATCHED THEN 
    INSERT INTO target (FileName, Date, Result) 
    VALUES ('File1', 'GetDate()', 'Test Passed')