2010-09-16 91 views
35

Mientras reviso algunos libros SQL encontré que los ejemplos tienden a usar signos de interrogación (?) en sus consultas. ¿Que representa?¿Qué representa un signo de interrogación en las consultas SQL?

+0

Podría dar el código para la consulta? – Gage

+0

Supongo que son variables en las declaraciones preparadas, pero debe publicar esa consulta en particular para estar seguro. – kennytm

+0

@Mitch Wheat, simplemente significa que puede obtener ayuda de los genios aquí con bastante satisfacción (si necesita respuestas de expertos). –

Respuesta

12

El ? es un parámetro sin nombre que puede ser completado por un programa que ejecuta la consulta para evitar SQL injection.

+0

¿Puedes dar un ejemplo de esto? – Brad

1

Normalmente representa un parámetro que debe suministrar el cliente.

2

Es un parámetro. Puede especificarlo al ejecutar la consulta.

2

No creo que tenga ningún significado en SQL. Es posible que esté buscando Declaraciones preparadas en JDBC o algo así. En ese caso, los signos de interrogación son marcadores de posición para los parámetros de la declaración.

5

El ? es para permitir Parameterized Query. Esta consulta parametrizada permite el valor específico del tipo cuando se reemplaza el ? con su valor respectivo.

Eso es todo.

Aquí hay un reason de por qué es mejor utilizar la consulta parametrizada. Básicamente, es más fácil de leer y depurar.

65

Lo que está viendo es una consulta parametrizada . Se usan con frecuencia al ejecutar SQL dinámico desde un programa.

Por ejemplo, en lugar de escribir esto (nota: pseudocódigo):

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

escribirte esta:

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

Esto tiene muchas ventajas, como es obvio, probablemente. Una de las más importantes: las funciones de la biblioteca que analizan sus parámetros son inteligentes y garantizan que las cadenas se escapen correctamente. Por ejemplo, si escribe esto:

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

¿Qué sucede cuando el usuario ingresa esto?

Robert'); DROP TABLE students; -- 

(respuesta es here)

escribir este lugar:

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

A continuación, la biblioteca se desinfectar la entrada, produciendo esto:

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

No todos los DBMS use ?. MS SQL utiliza el nombre parámetros, que considero una mejora enorme :

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

Respuesta muy clara que demuestra ejemplos y alternativas. Gracias. – Termato

+8

Más uno para la caricatura divertida – CHarris

+0

Excelente punto sobre los parámetros nombrados de MS SQL. – myidealab

Cuestiones relacionadas