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 :
Le message est le suivant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part EXEC sys.sp_execute_remote N'REMOTE_DB1', N'SELECT * FROM TOOLS'
La table "TOOLS" de mon script contient bien une colonne de type GEOGRAPHY.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.
Ç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) :
Voici la procédure stockée (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
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 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 quand je tente l'insert dans la table Tags_Sightings", j'obtiens le message suivant :
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
Je ne comprends pas pourquoi il essaie de faire une opération entre un int et un TAG_REPORT.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 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...
Partager