我试图使用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)是新的行代码。我只是修改了它,因为它有一个很好的控制台输出。
发布于 2013-05-27 13:46:46
你可以试试这个:
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.' 然后,您可以使用一个拆分函数将每个入站名称分隔到一个虚拟表中,然后光标穿过,得到表是否存在的答案。因此,在需要检查1到多个表的存在的任何情况下,存储过程都是有用的。
发布于 2013-05-27 15:15:25
我建议使用类似的方法来处理Brian,但是您也许可以用预期表名的一列声明一个表变量( @Expected ),然后您的测试可以是将所有从INFORMATION_SCHEMA.tables内部连接到@ expected (指定模式,等等)的条目选择到第二个表变量(@ declare )中。
然后,您可以使用tSQLt.AssetEqualsTable将@预期的内容与@ message进行比较--如果它们是相同的(所有对象都存在),那么您的测试就会通过,但是如果没有,那么测试将失败,所有不匹配的行(每个行都表示一个丢失的对象)将显示在失败消息中。
https://stackoverflow.com/questions/16764841
复制相似问题