【问题标题】:sql server table type clash operandsql server 表类型冲突操作数
【发布时间】:2012-10-08 21:12:30
【问题描述】:

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

我该如何解决这个问题?

【问题讨论】:

    标签: sql sql-server stored-procedures


    【解决方案1】:

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

    查看此Microsoft Connect item,按“设计”关闭。

    给出的理由是

    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
    

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多