sql server表类型的clash操作数

时间:2012-10-08 21:12:31

标签: sql sql-server stored-procedures

我有两个不同数据库模式中定义的相同表类型。当我尝试将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

如何解决此问题?

3 个答案:

答案 0 :(得分:13)

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

请参阅此Microsoft Connect item,关闭为“按设计”。

给出的推理是

  1. proc参数的[table]类型必须与传入参数的类型完全相同
  2. 验证规则(1)是否未应用变得越来越昂贵
  3. 在数据库之间传递表类型参数是不可能的,因为您不能使用像

    这样的代码
    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