web-dev-qa-db-fra.com

opérande de collision de type table serveur SQL

J'ai le même type de table défini dans deux schémas de base de données différents. Lorsque j'essaie d'appeler un SP d'un schéma à un autre en transmettant le type en paramètre, j'ai l'erreur suivante:

"Le conflit entre les types d'opérande myCustomType est incompatible avec myCustomType"

J'ai le code suivant:

Type de définition

CREATE TYPE myCustomType AS TABLE
(
  somevalue INT, 
  somevalue2 INT
);

Définition de procédure stockée

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

Exécution

USE db1
GO
DECLARE @myVar myCustomType
INSERT into @myVar(1,2)
EXEC PROC1 @myVar

Comment puis-je résoudre ce problème?

Vous vous heurtez à l'une des limitations du type de table défini par l'utilisateur.

Voir ceci Élément Microsoft Connect , fermé comme "tel que conçu".

Le raisonnement donné est que

  1. Le type [table] du paramètre proc doit être exactement le type du paramètre entrant
  2. Il devient de plus en plus coûteux de valider si la règle (1) n'était pas appliquée

Il est impossible de passer des paramètres de type table entre des bases de données, car vous ne pouvez pas utiliser de code tel que

create proc PROC2( 
 @myVar db1.dbo.myCustomType READONLY
)

L'erreur est:

Le nom de type 'db1.dbo.myCustomType' contient plus que le nombre maximal de préfixes. Le maximum est 1.

Le fait que vous les ayez nommés de la même manière et que vous leur ayez donné la même définition à la fois dans DB1 et DB2 ne les rend pas du même type - ils restent incompatibles, tout comme le fait le dessous qui échoue également sur une seule base de données:

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
13
RichardTheKiwi

J'utilise SQL Server 2012 sur les deux bases de données et cette limitation s'applique toujours.

Il y a un excellent article ici plein de solutions de contournement: http://www.sommarskog.se/share_data.html

Pour mon problème immédiat, je suis allé avec XML pour passer une table de données d'un proc à un autre. C'est maladroit, mais je dois seulement passer une douzaine d'enregistrements à la fois. Beaucoup plus que cela et je commençais à m'inquiéter de la performance.

1
JohnN

La seule façon pour que cela fonctionne est d'utiliser un type défini par l'utilisateur CLR, qui a également ses restrictions: https://technet.Microsoft.com/en-us/library/ms178069%28v=sql.105%29. aspx

0
Oooogi