我正在使用SQL Server 2008。
如何将表值参数传递给跨不同数据库但同一服务器的存储过程?
我应该在两个数据库中创建相同的表类型吗?
请根据问题给出示例或链接。
感谢您提供任何帮助。
我正在使用SQL Server 2008。
如何将表值参数传递给跨不同数据库但同一服务器的存储过程?
我应该在两个数据库中创建相同的表类型吗?
请根据问题给出示例或链接。
感谢您提供任何帮助。
回应此评论(如果我是正确的并且不可能在数据库之间使用 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
表 UDT 仅对同一数据库中的存储过程有效。
所以是的,您必须在每个服务器上创建类型并在存储的过程中引用它 - 例如,只需在两个数据库http://msdn.microsoft.com/en-us/library/bb510489 中运行此示例的第一部分。 .aspx _
如果您不需要效率,您可以随时使用其他方法 - 即传递一个 xml 文档参数或让 sp 期望一个带有输入数据的临时表。
编辑:添加示例
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
缺点是数据有两个副本。但是您可以同时对每个数据库运行批处理。这是否比使用表更好实际上取决于您拥有的处理/数据大小 - 顺便说一句,使用 sp 中的临时表您只需从 sp 代码访问它(如果它不存在则失败) .