sql server表类型的clash操作数

Vic*_*loy 17 sql sql-server stored-procedures

我有两个不同的数据库模式中定义的相同表类型.当我尝试从一个模式调用SP到另一个模式作为参数传递类型时,我收到以下错误:

"操作数类型冲突myCustomType与myCustomType不兼容"

我有以下代码:

类型定义

CREATE TYPE myCustomType AS TABLE
(
  somevalue INT, 
  somevalue2 INT
);
Run Code Online (Sandbox Code Playgroud)

存储过程定义

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
Run Code Online (Sandbox Code Playgroud)

执行

USE db1
GO
DECLARE @myVar myCustomType
INSERT into @myVar(1,2)
EXEC PROC1 @myVar
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个问题?

Ric*_*iwi 13

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

请参阅此Microsoft Connect项目,关闭为"按设计".

给出的理由是

  1. proc参数的[table]类型必须与传入参数的类型完全相同
  2. 验证规则(1)是否未应用变得越来越昂贵

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

create proc PROC2( 
 @myVar db1.dbo.myCustomType READONLY
)
Run Code Online (Sandbox Code Playgroud)

错误是:

类型名称"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
Run Code Online (Sandbox Code Playgroud)