Que représente un point d'interrogation dans les requêtes SQL? [dupliquer]

cette question a déjà une réponse ici:

  • Quelle est la signification du point d'interrogation dans MySQL à "où colonne = ?"? 4 réponses

en parcourant quelques livres SQL, j'ai constaté que les exemples ont tendance à utiliser des points d'interrogation ( ? ) dans leurs requêtes. Que fait-il représentent-ils?

38
demandé sur Joey 2010-09-16 18:31:46

6 réponses

ce que vous voyez est une requête paramétrée . Ils sont fréquemment utilisés lors de L'exécution de SQL dynamique à partir d'un programme.

par exemple, au lieu d'écrire ceci ( note: pseudocode ):

ODBCCommand cmd = new ODBCCommand("SELECT thingA FROM tableA WHERE thingB = 7")
result = cmd.Execute()

vous écrivez ceci:

ODBCCommand cmd = new ODBCCommand("SELECT thingA FROM tableA WHERE thingB = ?")
cmd.Parameters.Add(7)
result = cmd.Execute()

cela présente de nombreux avantages, comme cela est probablement évident. Une des plus importantes: les fonctions de la bibliothèque qui analysent vos paramètres sont intelligents, et s'assurer que les cordes sont échappées correctement. Par exemple, si vous écrivez ceci:

string s = getStudentName()
cmd.CommandText = "SELECT * FROM students WHERE (name = '" + s + "')"
cmd.Execute()

que se passe-t-il lorsque l'utilisateur entre ceci?

Robert'); DROP TABLE students; --

(réponse est ici )

écrivez ceci à la place:

s = getStudentName()
cmd.CommandText = "SELECT * FROM students WHERE name = ?"
cmd.Parameters.Add(s)
cmd.Execute()

puis la bibliothèque assainir l'entrée, produisant ce:

"SELECT * FROM students where name = 'Robert''); DROP TABLE students; --'"

pas tous les SGBD utilisez ? . MS SQL utilise nommé paramètres, que je considère comme un énorme amélioration:

cmd.Text = "SELECT thingA FROM tableA WHERE thingB = @varname"
cmd.Parameters.AddWithValue("@varname", 7)
result = cmd.Execute()
70
répondu egrunin 2011-10-04 23:15:29

le ? est un paramètre sans nom qui peut être rempli par un programme exécutant la requête pour éviter injection SQL .

12
répondu SLaks 2010-09-16 14:32:27

le ? est d'autoriser requête paramétrée . Ces requêtes paramétrées doivent permettre une valeur spécifique au type lors du remplacement du ? par leur valeur respective.

C'est tout.

Voici une raison de pourquoi il est préférable d'utiliser une requête paramétrée. En gros, c'est plus facile à lire et à déboguer.

5
répondu Buhake Sindi 2010-09-16 14:47:32

C'est un paramètre. Vous pouvez spécifier lors de l'exécution de la requête.

2
répondu amorfis 2010-09-16 14:33:01

Je ne pense pas que cela ait un sens en SQL. Vous pourriez être en train de regarder des déclarations préparées dans JDBC ou quelque chose. Dans ce cas, les points d'interrogation sont des espaces réservés pour les paramètres de l'instruction.

2
répondu vicatcu 2010-09-16 14:33:18

il représente normalement un paramètre à fournir par le client.

1
répondu Jens Schauder 2010-09-16 14:32:51