我有一个数据库中定义的表类型。它用作存储过程中的表值参数。我想从另一个数据库调用此过程,为了传递参数,我需要引用此定义的类型。

但是当我这样做 DECLARE @table dbOtherDatabase.dbo.TypeName ,它告诉我 The type name 'dbOtherDatabase.dbo.TypeName' contains more than the maximum number of prefixes. The maximum is 1.

如何引用此表类型?

有帮助吗?

解决方案

跨数据库用户定义的类型似乎仅适用于基于CLR的类型。看 这个论坛MSDN (加评论)。

其他提示

您可以尝试使用sp_executesql:

DECLARE @mylist integer_list_tbltype,
        @sql nvarchar(MAX)
SELECT  @sql = N'SELECT p.ProductID, p.ProductName
                 FROM    Northwind..Products p
                 WHERE   p.ProductID IN (SELECT n FROM @prodids)'
INSERT @mylist VALUES(9),(12),(27),(37)
EXEC sp_executesql @sql, N'@prodids integer_list_tbltype READONLY', @mylist

如果那不起作用,您可能必须在远程数据库中创建包装程序,在该过程中,您可以在CSV字符串中传递,并且包装器过程将其拆分并创建表(现在使用本地表类型),然后传递到该表中实际过程。看 这个答案 有关如何拆分CVS字符串的说明。

您不仅可以在两个数据库中定义类型吗?

编辑

有关如何做您需要的事情的文章

在此线程之前,但是我试图做同样的事情,并对同样的限制感到烦恼。

不要声明 @表,而请使用可以从EXEC字符串调用数据库的#表,可以将数据库切换到具有表类型的#表。

例如

use dbA
create type ThisTableRecord as table (id int, value varchar(max))

go

create procedure ThisTableSave
    @ThisTable ThisTableRecord readonly
AS
begin
    select * from @thisTable
end

go

use dbB

go

create procedure ThatTableSave

as begin

   create table #thatTable (id int, value varchar(max))

   insert into #thatTable
   values   (1, 'killing')
        ,   (2, 'joke')
        ,   (3, 'the')
        ,   (4, 'damned')

   exec ('
use dbA
declare @thisTable thisTableRecord
insert into @thisTable select * from #thatTable
exec thisTableSave @thisTable
')

end

exec ThatTableSave
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top