[SQL Server: 12.0.2269] Conversion d'un string en uniqueidentifier

Le problème exposé dans ce sujet a été résolu.

Bonjour, J’utilise (npm) MSSQL ainsi que SQL Server 12.0.2269 et j’ai besoin de récupérer des données dans une base de donnée. Je précise que je n’ai pas le schema de la db, je l’ai récupérée d’un serveur d’un jeu (dragonica)

    static async getCharacterById(characterId) {
        const memberKey = await sql.query`USE DR2_User; SELECT MemberID FROM TB_CharacterBasic WHERE CharacterID = ${characterId}`
        const memberData = await sql.query`USE DR2_Member; SELECT * FROM Member WHERE MemberKey = ${memberKey}`
    }

Pour la première ligne, je vais dans la base de donnée DR2_User, je sélecte la column MemberID dans la table TB_CharacterBasic lorsque CharacterID est égal au paramètre de la fonction.

Image utilisateur
Image utilisateur

Donc si je fais getCharacterById(’7796f31a-160b-4e7b-8acd-fa66c24d2908 Ensuite, je souhaite récupérer le compte de ce personnage, donc je vais aller dans la base de donnée DR2_Member, je vais prendre toutes les données lorsque MemberKey est égal à MemberID.

Image utilisateur
Image utilisateur

Le problème est que j’obtiens une erreur, (node:9196) UnhandledPromiseRejectionWarning: RequestError: Conversion failed when converting from a character string to uniqueidentifier (MemberID représente MemberKey dans une autre db)

J’ai tenté de convertir MemberID de cette manière : const memberData = await sql.queryUSE DR2_Member; SELECT * FROM Member WHERE MemberKey = Cast(${memberKey} AS UNIQUEIDENTIFIER` mais cela ne fonctionne pas et j’obtiens toujours la même erreur :/

Node.js: v12.8.1 Mssql: ^6.2.0 SQL Server: 12.0.2269

Comment est-ce que je pourrais faire svp ?

Merci et bonne journée/soirée !

Salut
il semblerait que SQL Server permettent de faire des jointures entre 2 bases (sur le même serveur évidemment)

SELECT *
FROM [DR2_Member].[Member] m
inner join [DR2_User].[TB_CharacterBasic] c
on c.[MemberID] = m.[MemberKey]

Angelo

Je comprends pas pourquoi j’obtiens l’erreur (node:8948) UnhandledPromiseRejectionWarning: RequestError: Invalid object name 'DR2_Member.Member' alors que la table existe bel et bien:

Image utilisateur
Image utilisateur
+0 -0

oups, j’ai oublié dbo

SELECT *
FROM [DR2_Member].[dbo].[Member] m
inner join [DR2_User].[dbo].[TB_CharacterBasic] c
on c.[MemberID] = m.[MemberKey]

Angelo

ah j’avais essayé mais sans les [], my bad ! Je vais essayer ça

EDIT: Ca fonctionne, par contre je sais pas si c’est possible de faire un inner join sur plusieurs tables, par exemple rajouter TB_CharacterSub

+0 -0

à priori, il n’y a pas de raison que tu ne puisses pas ajouter toutes les tables de ton choix pourvu que tu préfixes systématiquement avec le nom de la base de données

Angelo

Du coup j’ai essayé ça :

        const memberData = await sql.query`
        SELECT *
        FROM [DR2_Member].[dbo].[Member] m
        inner join [DR2_User].[dbo].[TB_CharacterBasic] c
        on c.[MemberID] = m.[MemberKey]
        inner join [DR2_User].[dbo].[TB_CharacterSub] s
        on c.[CharacterID] = s.[CharacterID]
        `

Mais j’ai (node:2904) UnhandledPromiseRejectionWarning: RequestError: Timeout: Request failed to complete in 15000ms donc je sais pas trop comment faire

Image utilisateur
Image utilisateur

tout d’abord, assures toi que la requête est correct lorsque tu l’exécute directement sur SQL Server
J’avais lu qu’une erreur de syntaxe pouvais également provoquer ce genre d’erreur (même sis c’était sur MySQL)

De plus le SELECT * est toujours déconseillé lorsqu’on fait des requêtes un peu complexe et dans le cas des jointures, je ne suis pas sur que SQL Server apprécie en cas de colonnes ayant le même nom dans des tables différentes

tout d’abord, assures toi que la requête est correct lorsque tu l’exécute directement sur SQL Server
J’avais lu qu’une erreur de syntaxe pouvais également provoquer ce genre d’erreur (même sis c’était sur MySQL)

De plus le SELECT * est toujours déconseillé lorsqu’on fait des requêtes un peu complexe et dans le cas des jointures, je ne suis pas sur que SQL Server apprécie en cas de colonnes ayant le même nom dans des tables différentes

Angelo

Oui, ça fonctionne correctement sur SQL Server

et une requête très simple ? par exemple :

const memberKey = await sql.query`
USE DR2_User; SELECT MemberID FROM TB_CharacterBasic`

Ton problème me fais penser à celui mais je ne suis pas certains

non, peut être pas :p

Angelo

Re,

Oui là ça fonctionne, je crois que je sais d’où le problème vient. En fait en bidouillant un peu j’ai eu (node:5608) UnhandledPromiseRejectionWarning: RequestError: Invalid column name 'Money'., alors je crois que le problème vient du fait que quand je joint les trois tables, alors y’a une confusion

De plus le SELECT * est toujours déconseillé lorsqu’on fait des requêtes un peu complexe et dans le cas des jointures, je ne suis pas sur que SQL Server apprécie en cas de colonnes ayant le même nom dans des tables différentes

Angelo

:D
Pour rappel, il suffit de préfixer le nom de la colonne avec celui de la table ou de l’alias pour retirer l’ambiguïté
Un exemple avec des tables de mon crue:

SELECT p.[id], c.[name]
FROM product p
INNER join customer c
on c.[id] = p.[customer_id]
+0 -0

De plus le SELECT * est toujours déconseillé lorsqu’on fait des requêtes un peu complexe et dans le cas des jointures, je ne suis pas sur que SQL Server apprécie en cas de colonnes ayant le même nom dans des tables différentes

Angelo

:D
Pour rappel, il suffit de préfixer le nom de la colonne avec celui de la table ou de l’alias pour retirer l’ambiguïté
Un exemple avec des tables de mon crue:

SELECT p.[id], c.[name]
FROM product p
INNER join customer c
on c.[id] = p.[customer_id]

Angelo

haha

C’est pourtant ce que j’ai fait non ?

        const memberData = await sql.query`
        SELECT *
        FROM [DR2_Member].[dbo].[Member] m
        inner join [DR2_User].[dbo].[TB_CharacterBasic] c
        on c.[MemberID] = m.[MemberKey]
        inner join [DR2_User].[dbo].[TB_CharacterSub] s
        on c.[CharacterID] = s.[CharacterID]
        `
+0 -0

non, il reste l’étoile

SELECT * 

signifie sort toutes les colonnes des 3 tables donc ici il y a un grand risque d’ambiguïté

Je te conseille donc de ne sortir que les colonnes qui t’intéresse

SELECT m.[COL_1], c.[COL_2]
FROM [DR2_Member].[dbo].[Member] m
inner join [DR2_User].[dbo].[TB_CharacterBasic] c
on c.[MemberID] = m.[MemberKey]
inner join [DR2_User].[dbo].[TB_CharacterSub] s
on c.[CharacterID] = s.[CharacterID]

avec COL_1 et COL_2 à personnaliser évidemment

non, il reste l’étoile

SELECT * 

signifie sort toutes les colonnes des 3 tables donc ici il y a un grand risque d’ambiguïté

Je te conseille donc de ne sortir que les colonnes qui t’intéresse

SELECT m.[COL_1], c.[COL_2]
FROM [DR2_Member].[dbo].[Member] m
inner join [DR2_User].[dbo].[TB_CharacterBasic] c
on c.[MemberID] = m.[MemberKey]
inner join [DR2_User].[dbo].[TB_CharacterSub] s
on c.[CharacterID] = s.[CharacterID]

avec COL_1 et COL_2 à personnaliser évidemment

Angelo

Yes merci ça marche ! Après le soucis c’est que j’arrive pas à prendre en compte le paramètre :

        const memberData = await sql.query`
        SELECT m.[MemberKey], m.[Email], m.[ID], c.[CharacterID], c.[Name], s.[Class], s.[Lv], s.[Exp], s.[Money], s.[f_ConnectionChannel]
        FROM [DR2_Member].[dbo].[Member] m
        inner join [DR2_User].[dbo].[TB_CharacterBasic] c
        on c.[MemberID] = m.[MemberKey]
        inner join [DR2_User].[dbo].[TB_CharacterSub] s
        on c.[${characterId}] = s.[${characterId}]
        `

Voici l’erreur: (node:11948) UnhandledPromiseRejectionWarning: RequestError: Incorrect syntax near '[@param1]'.

+0 -0

ici j’imagine que c’est un problème de concaténation
tu as une chaine de caractère (ta requête) que tu dois concaténer avec une variable

Comment fais tu cela habituellement ?

Cela dit, je suis étonné de voir une variable en nom de colonne …
C’est pas la valeur du where que tu veux tester plutôt ?

ici j’imagine que c’est un problème de concaténation
tu as une chaine de caractère (ta requête) que tu dois concaténer avec une variable

Comment fais tu cela habituellement ?

Cela dit, je suis étonné de voir une variable en nom de colonne …
C’est pas la valeur du where que tu veux tester plutôt ?

Angelo

Non en fait c’est parce que je fais une méthode :

    static async getCharacterById(characterId) {

        const memberData = await sql.query`
        SELECT m.[MemberKey], m.[Email], m.[ID], c.[CharacterID], c.[Name], s.[Class], s.[Lv], s.[Exp], s.[Money], s.[f_ConnectionChannel]
        FROM [DR2_Member].[dbo].[Member] m
        inner join [DR2_User].[dbo].[TB_CharacterBasic] c
        on c.[MemberID] = m.[MemberKey]
        inner join [DR2_User].[dbo].[TB_CharacterSub] s
        on c.[CharacterID] = s.[CharacterID]
        `

        await memberData.recordset[0]

        let finalCharacterData = {
            member: memberData,
        }

        return finalCharacterData
    }

si j’ai bien compris, je pense que c’est cela qui convient:

static async getCharacterById(characterId) {
        const memberData = await sql.query`
        SELECT m.[MemberKey], m.[Email], m.[ID], c.[CharacterID], c.[Name], s.[Class], s.[Lv], s.[Exp], s.[Money], s.[f_ConnectionChannel]
        FROM [DR2_Member].[dbo].[Member] m
        inner join [DR2_User].[dbo].[TB_CharacterBasic] c
        on c.[MemberID] = m.[MemberKey]
        inner join [DR2_User].[dbo].[TB_CharacterSub] s
        on c.[CharacterID] = s.[CharacterID]
        WHERE c.[CharacterID] = ${characterId}`
 
 
         await memberData.recordset[0]

         let finalCharacterData = {
             member: memberData,
         }
 
         return finalCharacterData
     }
 
+1 -0

si j’ai bien compris, je pense que c’est cela qui convient:

static async getCharacterById(characterId) {
        const memberData = await sql.query`
        SELECT m.[MemberKey], m.[Email], m.[ID], c.[CharacterID], c.[Name], s.[Class], s.[Lv], s.[Exp], s.[Money], s.[f_ConnectionChannel]
        FROM [DR2_Member].[dbo].[Member] m
        inner join [DR2_User].[dbo].[TB_CharacterBasic] c
        on c.[MemberID] = m.[MemberKey]
        inner join [DR2_User].[dbo].[TB_CharacterSub] s
        on c.[CharacterID] = s.[CharacterID]
        WHERE c.[CharacterID] = ${characterId}`
 
 
         await memberData.recordset[0]

         let finalCharacterData = {
             member: memberData,
         }
 
         return finalCharacterData
     }
 
Source:[Angelo](https://zestedesavoir.com/forums/sujet/13807/sql-server-1202269-conversion-dun-string-en-uniqueidentifier/?page=1#p217813)

Oui c’est bien ça merci bcp !!

Problème résolu :)

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte