2013-05-27 3 views
0

Я пытаюсь проверить наличие или отсутствие таблицы в базе данных с помощью AssertObjectExists. На самом деле у меня есть 10 таблиц, чтобы проверить, существуют ли эти таблицы или нет. Поскольку тест - это проверка существования таблиц. Я хочу собраться в одном тесте.Несколько утверждений с использованием tSQLt

Когда я сохраняю все утверждения в одном тесте, если какое-либо из утверждений объекта не выполняется, остальные утверждения не выполняются.

Моя цель - проверить, имеются ли таблицы из набора, например, 10 таблиц. И сообщите список таблиц, который не существует. Я вставляю пример кода ниже.

ALTER PROCEDURE [Test Tracker].[test TablesExists_01] 
AS 
BEGIN 

-- Verify the existance of each table 

EXEC tSQLt.AssertObjectExists @ObjectName = 'auth_user', 
    @Message = 'Unable to find auth_user Table' 

EXEC tSQLt.AssertObjectExists @ObjectName = 'auth_permissions', 
    @Message = 'Unable to find auth_permissions Table' 

EXEC tSQLt.AssertObjectExists @ObjectName = 'auth_groups', 
    @Message = 'Unable to find auth_groups Table' 


END; 

Может кто-то перенаправить меня по правому пути.

Edit: Решение Предоставлено Брайаном

IF (NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.Tables WHERE TABLE_NAME = 'auth_user' AND TABLE_SCHEMA = @schema)) 
    SET @errorMessage = @errorMessage + 'Unable to find auth_user' + CHAR(10) 

IF (NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.Tables WHERE TABLE_NAME = 'auth_group' AND TABLE_SCHEMA = @schema)) 
    SET @errorMessage = @errorMessage + 'Unable to find auth_group' + CHAR(10) 

IF LEN(@errorMessage) = 0 
    PRINT 'All the Tables in Authentication exists' 
ELSE 
    EXEC tsqlt.Fail @Message = @errorMessage 

В приведенном выше коде CHAR(10) новая строка кода. Я просто изменил его за то, что хороший выход консоли

ответ

1

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

Declare @tableName as varchar(100) 
set @tableName = 'auth_user' 

IF (EXISTS (SELECT * 
       FROM INFORMATION_SCHEMA.TABLES 
       WHERE TABLE_SCHEMA = 'dbo' 
       AND TABLE_NAME = @tableName)) 
BEGIN 
    --Do Stuff 
END 

set @tableName = 'auth_permissions' 
... 

Тогда просто перебирать остальные имена таблиц. Для того, чтобы сделать это очень легко, сделать эту хранимую процедуру, которая принимает одну строки в качестве параметра, который разделители как:

'auth_user|auth_permission|etc.' 

Тогда вы могли бы использовать Split функцию для разделения входящего имени в виртуальную таблицу вы могли бы курсор и получить ответы на вопрос о том, существует ли таблица. Таким образом, ваша хранимая процедура была бы полезна в любой ситуации, когда вы хотели бы проверить наличие 1 на многие таблицы.

+0

Благодарим за предоставление идеи. Я попробую это и обновит свои комментарии. – vkrams

+0

Perfect ... It Works .. Я обновил код в оригинальном вопросе – vkrams

1

Я бы предложил аналогичный подход к Брайану, но, возможно, вы можете объявить переменную таблицы (@Expected) с одним столбцом ожидаемых имен таблиц, тогда ваш тест может состоять в том, чтобы выбрать вторую переменную таблицы (@Actual) все эти записи из файла INFORMATION_SCHEMA.tables, присоединенные к @Expected (спецификация схемы и т. д. в предложении where).

Затем вы можете использовать tSQLt.AssetEqualsTable для сравнения содержимого @Expected с @Actual - если они одинаковы (все объекты существуют), тогда ваш тест пройдет, но если нет, то тест завершится неудачно, а все несоответствующие строки (каждый из которых указывает отсутствующий объект) появится в сообщении об ошибке.

+0

Мой тест - просто проверить, существует ли таблица или нет в схеме. Поэтому я думаю, что ваша логика слишком усложняет для меня :-) Однако я попробую – vkrams