将Table Valued参数传递给跨不同数据库的存储过程

时间:2012-03-02 10:32:14

标签: sql-server stored-procedures table-valued-parameters

我正在使用 SQL Server 2008

如何将表值参数传递到不同数据库存储过程,但是相同的服务器?

我应该在两个数据库中创建相同的表类型吗?

请根据问题举例或链接。

感谢您提供任何帮助。

2 个答案:

答案 0 :(得分:11)

回应此评论(如果我是正确的,并且无法在数据库之间使用TVP):

  

在这种情况下我有什么选择?使用XML类型?

纯粹主义的方法是说如果两个数据库都使用相同的数据,它们应该合并到一个数据库中。实用主义者意识到这并不总是可行的 - 但是因为你显然可以改变调用者和被调用者,所以可能只使用存储过程都知道的临时表。


  

我不相信它是可能的 - 你不能从另一个数据库引用一个表类型,即使在两个DB中使用相同的类型定义,一个类型的值也不能分配给另一个。


您没有传递数据库之间的临时表。临时表总是存储在tempdb中,只要连接打开且临时表没有被删除,连接就可以访问它。

因此,您在调用者中创建了临时表:

CREATE TABLE #Values (ID int not null,ColA varchar(10) not null)
INSERT INTO #Values (ID,ColA)
/* Whatever you do to populate the table */
EXEC OtherDB..OtherProc

然后在被叫方:

CREATE PROCEDURE OtherProc
/* No parameter passed */
AS
    SELECT * from #Values

答案 1 :(得分:1)

表UDT仅对同一数据库中的存储过程有效。

所以是的,你必须在每个服务器上创建类型并在存储过程中引用它 - 例如只需在两个数据库http://msdn.microsoft.com/en-us/library/bb510489.aspx中运行此示例的第一部分。

如果您不需要效率,可以始终使用其他方法 - 即传递xml文档参数或使用s.p.期望带有输入数据的临时表。

编辑:添加了示例

create database Test1
create database Test2
go
use Test1
create type PersonalMessage as TABLE
(Message varchar(50))
go
create proc InsertPersonalMessage @Message PersonalMessage READONLY AS
  select * from @Message
go
use Test2
create type PersonalMessage as TABLE
(Message varchar(50))
go
create proc InsertPersonalMessage @Message PersonalMessage READONLY AS
  select * from @Message
go
use Test1
declare @mymsg PersonalMessage
insert @mymsg select 'oh noes'
exec InsertPersonalMessage @mymsg 
go
use Test2
declare @mymsg2 PersonalMessage
insert @mymsg2 select 'oh noes'
exec InsertPersonalMessage @mymsg2 

缺点是有两份数据副本。 但是您可以同时对每个数据库运行批处理。 这是否比使用表格更好,实际上取决于你拥有的处理/数据大小 - 顺便使用来自s.p.的临时表。你只需从s.p.访问它。代码(如果它不存在则失败)。