首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用tSQLt的多个断言

使用tSQLt的多个断言
EN

Stack Overflow用户
提问于 2013-05-27 00:07:13
回答 2查看 832关注 0票数 0

我试图使用AssertObjectExists检查数据库中是否存在一个表。实际上,我有10个表来检查这些表是否存在。因为测试是验证表的存在。我想把它们放在一起做个测试。

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

我的目标是检查表是否存在于一组中,比如10个表。并报告不存在的表列表。我正在粘贴下面的示例代码。

代码语言:javascript
复制
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;

有人能把我引向正确的道路吗。

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

代码语言:javascript
复制
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)是新的行代码。我只是修改了它,因为它有一个很好的控制台输出。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-27 13:46:46

你可以试试这个:

代码语言:javascript
复制
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'
...

然后,只需迭代表的其余名称。为了使其变得非常简单,将其设置为一个存储过程,将单个字符串作为参数进行分隔,如:

代码语言:javascript
复制
'auth_user|auth_permission|etc.' 

然后,您可以使用一个拆分函数将每个入站名称分隔到一个虚拟表中,然后光标穿过,得到表是否存在的答案。因此,在需要检查1到多个表的存在的任何情况下,存储过程都是有用的。

票数 1
EN

Stack Overflow用户

发布于 2013-05-27 15:15:25

我建议使用类似的方法来处理Brian,但是您也许可以用预期表名的一列声明一个表变量( @Expected ),然后您的测试可以是将所有从INFORMATION_SCHEMA.tables内部连接到@ expected (指定模式,等等)的条目选择到第二个表变量(@ declare )中。

然后,您可以使用tSQLt.AssetEqualsTable将@预期的内容与@ message进行比较--如果它们是相同的(所有对象都存在),那么您的测试就会通过,但是如果没有,那么测试将失败,所有不匹配的行(每个行都表示一个丢失的对象)将显示在失败消息中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16764841

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档