web-dev-qa-db-fra.com

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

En parcourant certains livres SQL, j'ai constaté que les exemples avaient tendance à utiliser des points d'interrogation (?) dans leurs requêtes. Qu'est-ce que cela représente?

42
pradeep

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. L'une des plus importantes: les fonctions de bibliothèque qui analysent vos paramètres sont intelligentes et garantissent que les chaînes sont correctement échappées. 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 cela?

Robert'); DROP TABLE students; --

(La réponse est ici )

Écrivez ceci à la place:

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

Ensuite, la bibliothèque sanitize l'entrée, produisant ceci:

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

Tous les SGBD n'utilisent pas ?. MS SQL utilise les paramètres named, que je considère comme une amélioration énorme :

cmd.Text = "SELECT thingA FROM tableA WHERE thingB = @varname"
cmd.Parameters.AddWithValue("@varname", 7)
result = cmd.Execute()
76
egrunin

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

12
SLaks

Le ? permet d'autoriser la requête paramétrée . Cette requête paramétrée permet d'autoriser une valeur spécifique au type lors du remplacement de ? avec leur valeur respective.

C'est tout.

Voici une raison des raisons pour lesquelles il est préférable d'utiliser la requête paramétrée. Fondamentalement, il est plus facile à lire et à déboguer.

5
Buhake Sindi

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

2
amorfis

Je ne pense pas que cela ait un sens en SQL. Vous regardez peut-être les 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
vicatcu

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

1
Jens Schauder