0

我正在尝试使用AssertObjectExists. 实际上我有 10 个表来检查这些表是否存在。由于测试是验证表的存在。我想放在一个测试中。

当我将所有断言保留在一个测试中时,如果任何对象断言失败,则其余断言不会执行。

我的目标是检查一组说 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;

有人可以将我重定向到正确的路径。

编辑:布赖恩给出的解决方案

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)是换行代码。我刚刚修改了它以获得一个不错的控制台输出

4

2 回答 2

1

我建议对 Brian 采用类似的方法,但也许您可以声明一个表变量(@Expected),其中包含预期表名的单列,然后您的测试可以选择第二个表变量(@Actual)所有这些条目从 INFORMATION_SCHEMA.tables 内部连接到 @Expected(在 where 子句中指定模式等)。

然后,您可以使用tSQLt.AssetEqualsTable比较 @Expected 和 @Actual 的内容 - 如果它们相同(所有对象都存在),那么您的测试将通过,但如果不是,那么测试将失败,并且所有不匹配的行(每个指示丢失的对象)将显示在失败消息中。

于 2013-05-27T15:15:25.937 回答
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 到多个表的存在的任何情况下都会很有用。

于 2013-05-27T13:46:46.737 回答