Hello tout le monde.

Je cherche à exécuter une procédure stockée (avec un TVP) dans une sql database sur Azure (disons db1) depuis une autre sql database aussi sur Azure (disons db2).

J'ai bien réussi à créer une EXTERNAL DATA SOURCE depuis db2 vers db1.

Mais déjà, quand je tente d'exécuter le script ci-dessous, ça me râle dessus :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
EXEC sys.sp_execute_remote N'REMOTE_DB1', N'SELECT * FROM TOOLS'
Le message est le suivant :
The data type of the column 'db1.sys.geography' in the external table is different than the column's data type in the underlying standalone or sharded table present on the external source.
La table "TOOLS" de mon script contient bien une colonne de type GEOGRAPHY.

Ça, c'est mon premier problème et j'imagine que résoudre celui-là va aider à résoudre le suivant .

Mon but final (c'est le deuxième problème), c'est d'appeler une procédure stockée sur db1 depuis un trigger d'une table de db2.

J'ai donc créé le TVP et la procédure stockée qui va avec sur db1 et je les ai testé sur db1. Tout marche correctement.
Depuis db2, c'est une autre histoire.

Voici le TVP (sur db1) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
CREATE TYPE [dbo].[TAG_REPORT] AS TABLE(    [TAG_ID] [uniqueidentifier] NOT NULL,
    [POSITION] [geography] NOT NULL
)
GO
Voici la procédure stockée (sur db1) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
CREATE PROCEDURE [dbo].[SP_UPDATE_TOOL_CURRENT_POSITION]    @TAG_REPORTS TAG_REPORT READONLY
AS
BEGIN
    UPDATE    Tools
    SET        CurrentPosition = TR.POSITION
    FROM    Tools t
                INNER JOIN Tools_Tags tt
                    ON    T.Id = TT.ToolId
                    INNER JOIN @TAG_REPORTS TR
                        ON    TT.TagId = TR.TAG_ID
END
Et voilà le trigger (sur db2) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
ALTER TRIGGER DBO.TRG_TAGS_SIGHTINGS_INSERT   ON  DBO.Tags_Sightings
   AFTER INSERT
AS 
BEGIN
    SET NOCOUNT ON;
 
 
    DECLARE @REPORTS AS TABLE (TAG_ID UNIQUEIDENTIFIER NOT NULL, POSITION GEOGRAPHY NOT NULL);
 
 
    WITH T AS (
        SELECT    INS.TagId, S.Position, ROW_NUMBER() OVER (PARTITION BY INS.TagId ORDER BY S.Date DESC) AS 'RN'
        FROM    INSERTED INS
                    INNER JOIN Sightings s
                        ON    INS.SightingId = S.Id
    )
 
 
    INSERT INTO @REPORTS(TAG_ID, Position)
    SELECT    T.TagId, T.Position
    FROM    T
    WHERE    RN = 1;
 
 
    EXEC sys.sp_execute_remote    N'REMOTE_ASSET_MANAGEMENT',
                                N'SP_UPDATE_TOOL_CURRENT_POSITION @TAG_REPORTS',
                                N'@TAG_REPORTS TAG_REPORT READONLY',
                                @TAG_REPORTS = @REPORTS;
END
GO
Et quand je tente l'insert dans la table Tags_Sightings", j'obtiens le message suivant :
Error retrieving data from shard [DataSource=serverdb1.database.windows.net Database=db1]. The underlying error message received was: 'Operand type clash: int is incompatible with TAG_REPORT'.
Je ne comprends pas pourquoi il essaie de faire une opération entre un int et un TAG_REPORT.

Je me tourne donc vers vous.

Merci d'avance à ceux qui auront pris le temps de lire ce machin et encore plus à ceux qui pourront m'aider

P.S. : Je n'ai pas créé de table avec une external source si jamais c'est important. Je voulais le faire comme ça à la base mais les opérations dml sont interdites sur les external tables... D'où l'idée de la procédure avec sp_execute_remote...