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:
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
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
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
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.
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