如何理解Sql server表类型冲突操作数?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (57)

我在两个不同的数据库模式中定义了相同的表类型。当我试图将SP从一个模式调用到另一个模式,将类型作为参数传递给另一个模式时,我得到了以下错误:

"Operand type clash myCustomType is incompatible with myCustomType"

我有以下代码:

Type Definition

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

我怎样才能解决这个问题?

提问于
用户回答回答于

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

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

错误是:

The type name 'db1.dbo.myCustomType' contains more than the maximum number of prefixes. The maximum is 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
用户回答回答于

我在这两个数据库上使用SQLServer 2012,这个限制仍然适用。

我使用XML将数据表从一个proc传递到另一个proc。我一次只需要传几十个记录就行了。但性能不佳。

扫码关注云+社区