Stored procedures 可以使用多个数据库连接

Stored procedures 可以使用多个数据库连接,stored-procedures,linked-server,tsqlt,Stored Procedures,Linked Server,Tsqlt,刚接触tSQLt世界(很棒的工具集),在设置测试的存储过程中遇到了一个小问题 如果出于某种原因,我有一个连接到多个数据库甚至多个SQL服务器(链接服务器)的存储过程 在这种情况下,可以用tSQLt进行单元测试吗?我已经发表了评论,但我想补充一些。正如我已经说过的,你可以做任何适合单一交易的事情 但对于您的情况,我建议为每个跨数据库/实例对象创建同义词,然后在任何地方使用同义词 我创建了以下函数来模拟视图/表同义词。它有一些限制,但至少可以处理简单的用例 CREATE PROCEDURE [tSQ

刚接触tSQLt世界(很棒的工具集),在设置测试的存储过程中遇到了一个小问题

如果出于某种原因,我有一个连接到多个数据库甚至多个SQL服务器(链接服务器)的存储过程


在这种情况下,可以用tSQLt进行单元测试吗?

我已经发表了评论,但我想补充一些。正如我已经说过的,你可以做任何适合单一交易的事情

但对于您的情况,我建议为每个跨数据库/实例对象创建同义词,然后在任何地方使用同义词

我创建了以下函数来模拟视图/表同义词。它有一些限制,但至少可以处理简单的用例

CREATE PROCEDURE [tSQLt].[FakeSynonymTable] @SynonymTable VARCHAR(MAX)
AS
     BEGIN

         DECLARE @NewName VARCHAR(MAX)= @SynonymTable+REPLACE(CAST(NEWID() AS VARCHAR(100)), '-', '');
         DECLARE @RenameCmd VARCHAR(MAX)= 'EXEC sp_rename '''+@SynonymTable+''', '''+@NewName+''';';

        EXEC tSQLt.SuppressOutput
              @RenameCmd;

        DECLARE @sql VARCHAR(MAX)= 'SELECT * INTO '+@SynonymTable+' FROM '+@NewName+' WHERE 1=2;';

        EXEC (@sql);

        EXEC tSQLt.FakeTable
              @TableName = @SynonymTable;
     END; 

我已经发表了评论,但我想补充一些。正如我已经说过的,你可以做任何适合单一交易的事情

但对于您的情况,我建议为每个跨数据库/实例对象创建同义词,然后在任何地方使用同义词

我创建了以下函数来模拟视图/表同义词。它有一些限制,但至少可以处理简单的用例

CREATE PROCEDURE [tSQLt].[FakeSynonymTable] @SynonymTable VARCHAR(MAX)
AS
     BEGIN

         DECLARE @NewName VARCHAR(MAX)= @SynonymTable+REPLACE(CAST(NEWID() AS VARCHAR(100)), '-', '');
         DECLARE @RenameCmd VARCHAR(MAX)= 'EXEC sp_rename '''+@SynonymTable+''', '''+@NewName+''';';

        EXEC tSQLt.SuppressOutput
              @RenameCmd;

        DECLARE @sql VARCHAR(MAX)= 'SELECT * INTO '+@SynonymTable+' FROM '+@NewName+' WHERE 1=2;';

        EXEC (@sql);

        EXEC tSQLt.FakeTable
              @TableName = @SynonymTable;
     END; 

如果您不提供示例代码,我无法确定您的确切用例,但此信息可能会有所帮助

跨数据库测试的另一种方法(假设两个数据库位于同一实例上)是在两个数据库中安装tSQLt。然后,可以模拟远程数据库中的对象,方法与模拟本地对象相同

例如,如果您在LocalDb中有一个引用RemoteDb中的表的存储过程,则可以执行以下操作:

假设您有一个过程,该过程从本地数据库中名为localTable的表中选择一行,并将该行插入远程数据库中名为remoteTable的表中(在同一实例上)

上面的代码演示了基础知识,但几年前我在博客中对此进行了更详细的描述


不幸的是,这种方法无法跨链接服务器工作,

如果您不提供示例代码,我不确定您的确切用例,但这些信息可能会有所帮助

跨数据库测试的另一种方法(假设两个数据库位于同一实例上)是在两个数据库中安装tSQLt。然后,可以模拟远程数据库中的对象,方法与模拟本地对象相同

例如,如果您在LocalDb中有一个引用RemoteDb中的表的存储过程,则可以执行以下操作:

假设您有一个过程,该过程从本地数据库中名为localTable的表中选择一行,并将该行插入远程数据库中名为remoteTable的表中(在同一实例上)

上面的代码演示了基础知识,但几年前我在博客中对此进行了更详细的描述


不幸的是,这种方法无法跨链接服务器工作,

您可以做任何适合单个事务的事情。您可以做任何适合单个事务的事情。很好,谢谢,我有一些关于分布式事务的额外问题,但它们超出了我的范围。很好,谢谢,我有一些关于分布式事务的额外问题,但它们超出了我的范围。谢谢,是的,很抱歉有点冒昧。我已经按照本博客中的概述配置了测试项目:基本上你有两个数据库项目,一个用于实际实现,另一个用于测试用例。tSQLt需要安装在开发数据库中,并添加到使用tSQLt创建新数据库的测试项目中。一旦使用synomyms发布了测试项目,测试用例就应该使用这种方法。谢谢,是的,很抱歉,我已经按照本博客中的概述配置了测试项目:基本上您有两个数据库项目,一个用于实际实现,另一个用于测试用例。tSQLt需要安装在开发数据库中,并添加到使用tSQLt创建新数据库的测试项目中,一旦使用synomyms发布了测试项目,测试用例就应该使用这种方法