2017-06-08 6 views
0

データベースA上ストアドプロシージャの入力パラメータとして使用されるユーザー定義データ型があります。別のデータベース(DatabaseB)では、このプロシージャと同義語を作成していますが、そこに同じデータ型を作成しています。入力パラメータがユーザー定義のテーブル型であるプロシージャの同義語を呼び出す

私はエラーrecivingいsysnonym呼び出す「オペランドタイプ衝突を:IdsはIDを持つ互換性がありません」

この問題を解決する方法の任意の提案?

use DatabaseA 
go 

CREATE TYPE [dbo].[Ids] AS TABLE(
    [Id] [sql_variant] NULL 
) 
GO 

create procedure dbo.proc1 @Ids [Ids] readonly 
as 
begin 
    select * 
    from @Ids; 
end 


declare @Ids dbo.Ids; 
insert into @Ids values (1),(2) 
exec dbo.proc1 
    @Ids = @Ids 

use DatabaseB 

CREATE TYPE [dbo].[Ids] AS TABLE(
    [Id] [sql_variant] NULL 
) 
go 

CREATE SYNONYM [Admiral_CentralSystem01].[dbo_proc1] FOR [Admiral_CentralSystem01].[dbo].[proc1] 
GO 

declare @Ids dbo.Ids; 
insert into @Ids values (1),(2) 
exec [Admiral_CentralSystem01].[dbo_proc1] 
    @Ids = @Ids 
+0

? – Krismorte

+0

これを見てくださいhttps://stackoverflow.com/questions/9039455/should-i-use-sql-variant-data-type – Krismorte

+1

'B.dbo.Ids'は' A.dbo.Ids'ではありません。構造的に同一であることが起こる。タイプの同義語を作成することはできません(まあ、できますが動作しません)。適切な型のパラメータを宣言することはできないため、TVPを使用する別のデータベースのストアドプロシージャを呼び出すことはできません。それが何であるかに応じて、あなたが望むものを達成するためのほぼ確実な代替アプローチがあります。 –

答えて

1

テーブル変数を別のデータベースのパラメータとして渡すことはできません。 XPathので XML変数が

基本的
+0

良いアイデアのようなサウンド、ありがとう – JassyJov

1

テーブル変異体は、データベースは、Microsoft SQL Serverのユーザー定義型(UDT)を使用するためには

をスコープしている、あなたの問題解決することができ、あなたは それを登録する必要があります。 UDTを登録するには、アセンブリ を登録し、それを使用するデータベースにタイプを登録する必要があります。 UDTは1つのデータベースにスコープされており、同一のアセンブリとUDTが 各データベースで登録されていない限り、複数の データベースで使用することはできません。 UDTアセンブリが登録され、タイプが の場合、Transact-SQLおよびクライアントコードでUDTを使用できます。 詳細については、「CLRユーザー定義型」を参照してください。あなたがする必要が正確に何

https://docs.microsoft.com/en-us/sql/relational-databases/clr-integration-database-objects-user-defined-types/registering-user-defined-types-in-sql-server

関連する問題