IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement SQL Server Discussion :

[AZURE] sp_execute_remote : data type GEOGRAPHY


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Par défaut [AZURE] sp_execute_remote : data type GEOGRAPHY
    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...

  2. #2
    Membre expérimenté
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Par défaut
    Pour ceux que ça intéresse, je viens de tomber sur ceci (voir la fin de la page).

    En gros, ça dit que les TVP, c'est du code compilé et donc qu'on ne peut pas les utiliser en cross db...

    Le message "Operand type clash" reste bizarre mais bon...

    Après, cette info dans quand même de 2010 et ne concerne pas les db azure donc je garde espoir...

  3. #3
    Membre expérimenté
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Par défaut
    Toujours pour ceux que ça intéresse, j'ai contourné le problème.

    A la place d'un TVP, je stock les infos que je transmettrais normalement dans une table prévue à cet effet. J'ai juste ajouté un colonne ID de type uniqueidentifier pour permettre d'identifier les lots de données qui vont ensemble.

    Une fois cet INSERT fait, je fais un sp_execute_remote en passant en paramètre l'ordre sql qui était dans la procédure stockée. Simplement à la place de faire une jointure sur le TVP, je fais la jointure sur la table mentionnée ci-dessous car un SELECT sur une external data source, ça marche bien.

    En pratique, ça ne marche pas encore via le trigger (il y a apparemment un problème de permission que je n'ai pas encore bien cerné) mais si j'exécute moi-même le sp_execute_remote, ça fonctionne bien.

    Je ferme donc ce topic et vais peut-être en ouvrir un outre pour cette histoire de permission... Cela va dépendre de mes tests de ce soir/demain matin.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [People Soft] Extraction "Long raw data type"
    Par argyronet dans le forum Oracle
    Réponses: 2
    Dernier message: 13/09/2005, 22h18
  2. erreur Data type mismatch in criteria expression
    Par bachilbouzouk dans le forum ASP
    Réponses: 3
    Dernier message: 20/04/2005, 11h48
  3. datetime data type resulted in an out-of-range
    Par faamugol dans le forum ASP
    Réponses: 2
    Dernier message: 26/05/2004, 20h51
  4. [SQL Server] Error converting data type varchar...
    Par Sir Tengu dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 13/06/2003, 10h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo