18

2つの異なるデータベーススキーマで同じテーブルタイプが定義されています。タイプをパラメーターとして渡して、あるスキーマから別のスキーマに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

この問題を解決するにはどうすればよいですか?

4

3 に答える 3

17

ユーザー定義のテーブルタイプの制限の1つに直面しています。

「設計どおり」として閉じられた、このMicrosoftConnectアイテムを参照してください。

与えられた理由はそれです

  1. proc paramの[table]typeは、着信paramのタイプと正確に一致している必要があります
  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
于 2012-10-08T21:57:07.783 に答える
1

両方のデータベースでSQLServer2012を使用していますが、この制限は引き続き適用されます。

回避策が満載のすばらしい記事がここにあります:http: //www.sommarskog.se/share_data.html

私の当面の問題では、XMLを使用して、あるプロシージャから別のプロシージャにデータのテーブルを渡しました。不格好ですが、一度に数十のレコードを渡すだけで済みます。それ以上に、パフォーマンスについて心配し始めます。

于 2014-08-04T09:09:13.530 に答える
0

これが機能する唯一の方法は、CLRユーザー定義型によるものであり、制限もあります: https ://technet.microsoft.com/en-us/library/ms178069%28v=sql.105%29.aspx

于 2016-06-15T13:54:00.960 に答える