首页 文章

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

提问于
浏览
10

我正在使用 SQL Server 2008 .

如何通过 different DatabasesTable Valued 参数传递给 Stored procedure ,但是相同的服务器?

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

请根据问题给出一个示例或链接 .

谢谢你的帮助 .

2 回答

  • 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

    表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.访问它 . 代码(如果它不存在则失败) .

相关问题