SQL2k8中如何使用另一个数据库中定义的数据类型(表)?

Posted

技术标签:

【中文标题】SQL2k8中如何使用另一个数据库中定义的数据类型(表)?【英文标题】:How to use a data type (table) defined in another database in SQL2k8? 【发布时间】:2010-05-20 18:44:04 【问题描述】:

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

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

如何引用此表类型?

【问题讨论】:

【参考方案1】:

跨数据库用户定义类型似乎只适用于基于 CLR 的类型。请参阅 this forum 和 MSDN(加上 cmets)。

【讨论】:

【参考方案2】:

您可以尝试使用 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 字符串的说明,请参阅 this answer。

【讨论】:

它可以工作,但不幸的是,这是我们不能在这里做的事情:P 通常这是一种非常糟糕的编码习惯,所以我们避免大量使用未编译的脚本。编辑:问题真的不在于调用程序。事实上,问题在于类型声明。【参考方案3】:

你能不能只在两个数据库中定义类型。

编辑

请参阅this 文章,了解如何满足您的要求

【讨论】:

它不起作用 :( 如果我这样做,我会得到“操作数类型冲突:TypeName 与 TypeName 不兼容” 我已经更新了我的答案,其中包含一个指向 msdn 文章的链接,该文章告诉你如何做到这一点。 这不起作用。我认为就像@devio 说的,只有 CLR 类型可以在数据库之间共享(您的链接并没有准确地说明这一点,但我们可以从这句话中理解:“类型必须具有相同的名称,包括相同的 CLR 名称, 并且必须通过两个数据库中的相同程序集来实现。")。如果真的是这样的话,used-defined types 好像很烂!【参考方案4】:

在之前的这个帖子中,但我试图做同样的事情并且对同样的限制感到恼火。

不要声明@表,而是使用#表,该表可以从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

【讨论】:

以上是关于SQL2k8中如何使用另一个数据库中定义的数据类型(表)?的主要内容,如果未能解决你的问题,请参考以下文章

eclipse中在一个类中定义另一个类

MFC 如何在一个类中使用另一个类中定义的变量

是否可以在 postgresql 的另一个模式中使用一个模式的枚举类型

如何将定义 typescript 文件类型文件链接到 deno 的另一个定义类型文件中?

如何在 mongodb 中使用 $lookup 从该表中获取与另一个表连接的数据

如何在laravel中为api后端返回JSON数据之前定义数据类型