2012-04-23 20 views
4

我正在使用tSQLt(通过Red Gate的SQL Test版本1.0.0.455)。 tSQLt安装在数据库A.我试图通过对数据库A的代名词做tSQLt.FakeTable上在同一个SQL Server实例数据库B表tSQLt尝试伪造一个同义词表时失败

代码:

ALTER PROCEDURE [ 。ErrorType109NonTankHasSizeOrVolume] [试验AliasTest] AS

BEGIN
Exec的tSQLt.FakeTable 'dbo.Bygning';

插入到dbo.Bygning(ObjStatus)值(1);

EXEC tSQLt.AssertEquals 1,1
END;

dbo.Bygning是数据库中的一个代名词指的是在数据库B和ObjStatus表是dbo.Bygning

错误信息一栏:

Transaction count after EXECUTE indicates a mismatching number of BEGIN and COMMIT statements. Previous count = 0, current count = 1. 

Transaction count after EXECUTE indicates a mismatching number of BEGIN and COMMIT statements. Previous count = 0, current count = 1. 

Transaction count after EXECUTE indicates a mismatching number of BEGIN and COMMIT statements. Previous count = 0, current count = 1. 

[ErrorType109NonTankHasSizeOrVolume].[test AliasTest] failed: An invalid parameter or option was specified for procedure 'sp_addextendedproperty'.{sp_addextendedproperty,37} 

有什么办法来tSQLt.FakeTable同义词表?

澄清: 运行测试时出现错误消息。

+0

'EXEC tSQLt.AsserEquals 1,1''不需要在代码示例中。这条线从来没有达到(失败发生之前)。 – steenhulthin 2012-04-23 17:57:02

+0

您是否在同一会话中立即运行其他SQL语句? – mellamokb 2012-04-23 17:58:55

+0

不,我在打开Management Studio之后运行测试。 – steenhulthin 2012-04-23 18:00:35

回答

4

tSQLt目前不支持伪造同义词。不过,我认为可能很容易为此添加支持。我很快原型化了以下修复程序,并希望它可以解决您的问题。你可以请尝试并确认吗?如果它适合你,我会确保它进入下一个版本。

ALTER PROCEDURE tSQLt.Private_MarkFakeTable 
    @SchemaName NVARCHAR(MAX), 
    @TableName NVARCHAR(MAX), 
    @NewNameOfOriginalTable NVARCHAR(4000) 
AS 
BEGIN 
    DECLARE @UnquotedSchemaName NVARCHAR(MAX);SET @UnquotedSchemaName = OBJECT_SCHEMA_NAME(OBJECT_ID(@SchemaName+'.'[email protected])); 
    DECLARE @UnquotedTableName NVARCHAR(MAX);SET @UnquotedTableName = OBJECT_NAME(OBJECT_ID(@SchemaName+'.'[email protected])); 
    DECLARE @Level1Type NVARCHAR(MAX); 

    SELECT @Level1Type = 
    CASE type 
     WHEN 'SN' THEN 'SYNONYM' 
     ELSE 'TABLE' 
    END 
    FROM sys.objects 
    WHERE object_id = OBJECT_ID(@SchemaName+'.'[email protected]); 


    EXEC sys.sp_addextendedproperty 
     @name = N'tSQLt.FakeTable_OrgTableName', 
     @value = @NewNameOfOriginalTable, 
     @level0type = N'SCHEMA', @level0name = @UnquotedSchemaName, 
     @level1type = N'TABLE', @level1name = @UnquotedTableName; 
END; 
GO 
+0

在进一步的调查中,这将不起作用,因为当它试图创建假表时,将不会找到列。我会继续深入研究这个问题,看看我能否想出一个解决方案。 – dennislloydjr 2012-04-24 22:48:40

+0

谢谢。这将非常感激。我可以确认代码不能像发布一样工作。但是,您的答案“tSQLt目前不支持伪造同义词。”是正确的。我将调整问题以包含版本号。 – steenhulthin 2012-04-25 08:32:22

2

我今天遇到了这个,并设计了以下解决方案。

在组装部分:

CREATE TABLE #mock 
(
    id_item VARCHAR(15), 
    descr_1 VARCHAR(50) 
) 
INSERT INTO #mock 
    (id_item, descr_1) 
VALUES ('123456-01', 'Great description here'), 
     ('123456-02', 'Blue, gnarly, cloud') 
EXEC sp_rename 'syn_name', 'syn_name_orig' 
CREATE SYNONYM syn_name FOR #mock 

在行为节结束后再清理:

DROP SYNONYM syn_name 
EXEC sp_rename 'syn_name_orig', 'syn_name' 

它为我工作。尝试使用同义词的并发进程可能有副作用,但我只在开发环境中运行我的测试,所以我不担心它。

1

我使用的解决方法是将生产代码更改为使用视图,然后使用同义词。然后我可以使用tSQLt.FakeTable模拟视图。