我刚刚开始为我的数据库创建一些单元测试。
如果我伪造了一张桌子,
EXEC tSQLt.FakeTable
@TableName = 'dbo.[My Table]',
@Identity = 0,
@ComputedColumns = 0,
@Defaults = 0
我可以查看它是否已被伪造?
请注意,可以找到关于FakeTable SP的文档here。
动机
我希望能够这样做,因为我想创建几个存储过程来填充这些伪造的表,以便我可以执行测试。 但是我不想在存储过程中处理伪造表(因此我可以多次调用它们每次输入不同的信息)。
我不希望在添加数据之前忘记伪造表格(因为这几乎肯定会导致我的测试失败)。
答案 0 :(得分:3)
tSQLt将一个扩展属性添加到假表中以跟踪它伪造的表。使用函数tSQLt.Private_GetOriginalTableName
:
SELECT tSQLt.Private_GetOriginalTableName('dbo','[My Table]')
如果表格没有伪造,这将返回NULL
。
如果您想要做一些更复杂的事情,可以直接查询sys.extended_properties
。有关tSQLt.class.sql
的定义,请参阅tSQLt.Private_GetOriginalTableName
脚本的内容(在tSQLt distribution中)。
答案 1 :(得分:0)
您可以在存储过程的开头检查表是否存在。
If Not Exists ( Select 1 From Sys.Objects Where [Name] = 'YOURTABLENAME' And [Type] = 'U')
Begin
-- Your Create Table Statement Here
ENd
根据您的评论,该工具必须使用schema:
执行类似的操作Create table dbo.MisterPositive ( test int )
Create table developers.MisterPositive (test Int )
-- Both statements below work
Select * From dbo.MisterPositive
Select * From developers.MisterPositive
- 用它来寻找先前的存在
Select 1 from sys.objects
Inner join sys.schemas ON sys.objects.schema_id = sys.schemas.schema_id
where sys.objects.[Name] = 'MisterPositive' And sys.schemas.name = 'dbo'
Select 1 from sys.objects
Inner join sys.schemas ON sys.objects.schema_id = sys.schemas.schema_id
where sys.objects.[Name] = 'MisterPositive' And sys.schemas.name = 'Developers'
所以你的
If Not Exists ( Select 1 from sys.objects
Inner join sys.schemas ON sys.objects.schema_id = sys.schemas.schema_id
where sys.objects.[Name] = 'YOURTABLE' And sys.schemas.[Name] = 'tSQLt' )
Begin
-- create table here
End