18

我在两个不同的数据库模式中定义了相同的表类型。当我尝试从一个模式调用 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

我该如何解决这个问题?

4

3 回答 3

17

您遇到了用户定义表类型的限制之一。

请参阅此Microsoft Connect 项目,按“设计”关闭。

给出的理由是

  1. proc 参数的 [table]type 必须与传入参数的类型完全相同
  2. 验证规则 (1) 是否被应用变得越来越昂贵

在数据库之间传递表类型参数是不可能的,因为你不能使用类似的代码

create proc PROC2( 
 @myVar db1.dbo.myCustomType READONLY
)

错误是:

类型名称“db1.dbo.myCustomType”包含的前缀数量超过了最大数量。最大值为 1。

仅仅因为您将它们命名为相同并在 DB1 和 DB2 中为它们提供了相同的定义并不会使它们成为相同的类型 - 它们仍然不兼容,就像下面在单个 db 上也失败的情况一样:

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
于 2012-10-08T21:57:07.783 回答
1

我在两个数据库上都使用了 SQL Server 2012,这个限制仍然适用。

这里有一篇很棒的文章,里面充满了解决方法:http: //www.sommarskog.se/share_data.html

对于我的直接问题,我使用 XML 将数据表从一个 proc 传递到另一个。这很笨重,但我一次只需要通过几十条记录。不止于此,我开始担心性能。

于 2014-08-04T09:09:13.530 回答
0

唯一可行的方法是通过 CLR 用户定义类型,它也有其限制: https ://technet.microsoft.com/en-us/library/ms178069%28v=sql.105%29.aspx

于 2016-06-15T13:54:00.960 回答