@H_403_1@我有两种不同的数据库模式中定义的相同的表类型.当我尝试从一个模式调用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
如何解决这个问题?
解决方法
@H_502_25@ 您会发现用户定义的表类型的一个限制.看到这个Microsoft Connect item,被关闭为“设计”.
推理是这样的
> proc参数的[table]类型必须完全是传入参数的类型
如果规则(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.
只是因为你给它们命名相同,并且给它们在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