【问题标题】:Cross-server transaction with msdtc, switching context of DML without dynamic SQL带msdtc的跨服务器事务,不用动态SQL切换DML的上下文
【发布时间】:2011-03-21 04:08:50
【问题描述】:
我的设计中有两个 SQL Server 数据库。我有一个包含两个数据库的 DML 语句的事务。
问题是第二个数据库名称没有预定义。它可以是存储过程的参数。我想在每个 DML 语句中指定数据库名称和服务器名称。
不使用动态SQL,有没有办法切换语句的上下文。
或者简单地说:我如何在服务器名称和数据库名称是动态参数的 DML 语句中为服务器名称和数据库名称添加前缀?
有没有办法在不使用动态 SQL 的情况下做到这一点?或者有没有其他方法来处理这个问题?
【问题讨论】:
标签:
database
sql-server-2005
stored-procedures
msdtc
【解决方案1】:
在单独的 SP 或流程中处理 DML 不是更好的做法,而不是将它们加入现有流程中。不能在四部分名称中使用变量:
除非另有说明,否则对数据库对象名称的所有 Transact-SQL 引用都可以是以下形式的四部分名称:
server_name .[database_name].[schema_name].object_name
| database_name.[schema_name].object_name
| schema_name.object_name
|对象名
服务器名称
指定链接服务器名称或远程服务器名称。
数据库名称
当对象驻留在 SQL Server 的本地实例中时,指定 SQL Server 数据库的名称。当对象在链接服务器中时,database_name 指定一个 OLE DB 目录。
架构名称
如果对象位于 SQL Server 数据库中,则指定包含该对象的架构的名称。当对象位于链接服务器中时,schema_name 指定 OLE DB 架构名称。有关架构的详细信息,请参阅用户架构分离。
对象名称
引用对象的名称。