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中如何使用另一个数据库中定义的数据类型(表)?的主要内容,如果未能解决你的问题,请参考以下文章
是否可以在 postgresql 的另一个模式中使用一个模式的枚举类型
如何将定义 typescript 文件类型文件链接到 deno 的另一个定义类型文件中?