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

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

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

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

"Operand type clash myCustomType is incompatible with 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

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

提问于
用户回答回答于

给出的理由是

  1. 大表proc param的类型必须完全是传入param的类型。
  2. 如果不适用规则(1),验证成本会越来越高。

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

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.

Just because you named them the same and gave them the same definition in both DB1 and DB2 does not make them the same type - they remain incompatible, as much as the below which also fails on a single db:

仅仅因为您在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,这个限制仍然适用。

扫码关注云+社区