【问题标题】:Passing Table Valued parameter to stored procedure across different databases将表值参数传递给跨不同数据库的存储过程
【发布时间】:2012-03-02 10:32:14
【问题描述】:

我正在使用 SQL Server 2008

我如何将 Table Valued 参数传递给跨不同数据库但同一服务器的存储过程

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

请根据问题给出例子或链接。

感谢您的任何帮助。

【问题讨论】:

  • 我不相信这是可能的——你不能从另一个数据库中引用一个表类型,即使两个数据库中的类型定义相同,一个类型的值也不能分配给另一个.
  • 在这种情况下我有什么选择?使用 XML 类型?

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


【解决方案1】:

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

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

纯粹的方法是说,如果两个数据库都在处理相同的数据,那么它们应该合并到一个数据库中。实用主义者意识到这并不总是可能的 - 但是由于您显然可以同时更改调用者和被调用者,因此也许只需使用两个存储过程都知道的临时表。


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


您不会在数据库之间传递临时表。临时表始终存储在 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

【讨论】:

  • 以及如何在数据库之间传递临时表。你能提供一个例子吗?谢谢。
  • @hgulyan - 在我的答案底部添加了一个示例 - 你根本没有通过它。
  • 哇,不知道。谢谢。效果很好!
【解决方案2】:

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

所以是的,您必须在每个服务器上创建类型并在存储的过程中引用它 - 例如只需在两个 DB 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. 访问它。代码(如果不存在则失败)。

【讨论】:

  • 它不起作用。我收到此错误“操作数类型冲突:PersonalMessages 与 PersonalMessages 不兼容”
  • 是的,一个限制是,当您声明表时,它使用绑定到当前数据库上下文的数据类型。所以你必须做:“使用 db1”,创建表并调用 proc,去,“使用 db2”等。你可以切换到将临时表传递给 s.p。或者填充一个全局临时表,然后为每个数据库传递一个单独的表变量。
  • 但问题是在两个数据库之间使用表类型。
  • 我尝试过同样的事情,但这不是我需要的。我需要从 test1 db 执行存储在 test2 中。类似声明 mymsg PersonalMessage insert mymsg select 'oh noes' exec test2.dbo.InsertPersonalMessage mymsg
  • 啊哈,是的,因此您需要在删除消息之前将数据库上下文更改为 test2。听起来临时表是更好的解决方案!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-12
  • 1970-01-01
  • 2012-09-01
  • 2016-04-05
相关资源
最近更新 更多