我有两个不同数据库模式中定义的相同表类型。当我尝试将SP从一个模式调用到另一个模式,并将类型作为参数传递时,我收到以下错误:
“操作数类型冲突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
如何解决此问题?
答案 0 :(得分:13)
您遇到了用户定义的表类型的一个限制。
请参阅此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
答案 1 :(得分:1)
我在两个数据库上都使用SQL Server 2012,但这种限制仍然适用。
这里有一篇很棒的文章,里面有各种解决方法: http://www.sommarskog.se/share_data.html
对于我的直接问题,我已经使用XML将数据表从一个proc传递到另一个proc。它很笨重,但我只需要一次传递几十条记录。还有更多,我开始担心性能。
答案 2 :(得分:0)
唯一可行的方法是使用CLR用户定义的类型,它也有其限制: https://technet.microsoft.com/en-us/library/ms178069%28v=sql.105%29.aspx