我在两个不同的数据库模式中定义了相同的表类型。当我尝试将类型作为参数从一个架构调用到另一个架构时,我得到了以下错误:
“操作数类型clash myCustomType与myCustomType不兼容”
我有以下代码:
类型定义
CREATE TYPE myCustomType AS TABLE
(
somevalue INT,
somevalue2 INT
);
存储过程定义
USE DB1
GO
CREATE PROC1(
@myVar myCustomType READONLY
)
AS
BEGIN
EXEC db2.dbo.PROC2 @myVar
END
GO
USE DB2
GO
CREATE PROC2(
@myVar myCustomType READONLY
)
AS
BEGIN
--do something with myVar
END
执行
USE db1
GO
DECLARE @myVar myCustomType
INSERT into @myVar(1,2)
EXEC PROC1 @myVar
我如何解决这个问题?
发布于 2012-10-09 05:57:08
您遇到了用户定义的表类型的一个限制。
查看此Microsoft Connect item,关闭为“按设计”。
给出的理由是
的成本会越来越高
在数据库之间传递表型参数是不可能的,因为您不能使用如下代码
create proc PROC2(
@myVar db1.dbo.myCustomType READONLY
)
错误是:
类型名称'db1.dbo.myCustomType‘包含的前缀超过了最大数目。最大值为1。
仅仅因为您在DB1和DB2中为它们命名并给出相同的定义,并不能使它们成为相同的类型-它们仍然是不兼容的,就像下面的在单个数据库上也失败了一样:
CREATE TYPE myCustomTypeX AS TABLE
(
somevalue INT,
somevalue2 INT
);
GO
create proc procX
@in myCustomTypeX readonly
AS
select * from @in myCustomTypeX;
GO
declare @myCustomTypeX TABLE
(
somevalue INT,
somevalue2 INT
);
exec procX @myCustomTypeX
--
Msg 206, Level 16, State 2, Procedure procX, Line 0
Operand type clash: table is incompatible with myCustomTypeX
发布于 2014-08-04 17:09:14
我在两个数据库上都使用SQL Server 2012,此限制仍然适用。
这里有一篇很棒的文章,里面有很多变通的方法:http://www.sommarskog.se/share_data.html
对于我直接遇到的问题,我使用XML将数据表从一个进程传递到另一个进程。它很笨拙,但我一次只需要通过几十个记录。除此之外,我还会开始担心性能问题。
发布于 2016-06-15 21:54:01
唯一可行的方法是使用CLR用户定义的类型,而且它也有自己的限制:https://technet.microsoft.com/en-us/library/ms178069%28v=sql.105%29.aspx
https://stackoverflow.com/questions/12789560
复制相似问题