DocumentDB SQL - Parametrizado

En las bases de datos relacionales, una consulta parametrizada es una consulta en la que se utilizan marcadores de posición para los parámetros y los valores de los parámetros se proporcionan en el momento de la ejecución. DocumentDB también admite consultas parametrizadas, y los parámetros de la consulta parametrizada se pueden expresar con la notación @ familiar. La razón más importante para utilizar consultas parametrizadas es evitar ataques de inyección de SQL. También puede proporcionar un manejo robusto y escapar de la entrada del usuario.

Echemos un vistazo a un ejemplo en el que utilizaremos .Net SDK. A continuación se muestra el código que eliminará la colección.

private async static Task DeleteCollection(DocumentClient client, string collectionId) { 
   Console.WriteLine(); 
   Console.WriteLine(">>> Delete Collection {0} in {1} <<<", 
   collectionId, _database.Id);  
   var query = new SqlQuerySpec { 
      QueryText = "SELECT * FROM c WHERE c.id = @id", 
      Parameters = new SqlParameterCollection { new SqlParameter { Name = 
         "@id", Value = collectionId } } 
   };
   
   DocumentCollection collection = client.CreateDocumentCollectionQuery(database.SelfLink, 
      query).AsEnumerable().First();  
		
   await client.DeleteDocumentCollectionAsync(collection.SelfLink);  
	
   Console.WriteLine("Deleted collection {0} from database {1}", 
      collectionId, _database.Id); 
}

La construcción de una consulta parametrizada es la siguiente.

var query = new SqlQuerySpec { 
   QueryText = "SELECT * FROM c WHERE c.id = @id",
   Parameters = new SqlParameterCollection { new SqlParameter { Name = 
      "@id", Value = collectionId } } 
};

No estamos codificando el ID de colección, por lo que este método se puede utilizar para eliminar cualquier colección. Podemos usar el símbolo '@' para prefijar nombres de parámetros, similar a SQL Server.

En el ejemplo anterior, estamos consultando una colección específica por Id donde el parámetro Id está definido en este SqlParameterCollection asignado a la propiedad del parámetro de este SqlQuerySpec. El SDK luego hace el trabajo de construir la cadena de consulta final para DocumentDB con el collectionId incrustado dentro de él. Ejecutamos la consulta y luego usamos su SelfLink para eliminar la colección.

A continuación se muestra la implementación de la tarea CreateDocumentClient.

private static async Task CreateDocumentClient() { 
   // Create a new instance of the DocumentClient 
   using (var client = new DocumentClient(new Uri(EndpointUrl), AuthorizationKey)) { 
      database = client.CreateDatabaseQuery("SELECT * FROM 
         c WHERE c.id = 'earthquake'").AsEnumerable().First(); 
			
      collection = client.CreateDocumentCollectionQuery(database.CollectionsLink, 
         "SELECT * FROM c WHERE c.id = 'myfirstdb'").AsEnumerable().First();
			
      await DeleteCollection(client, "MyCollection1"); 
      await DeleteCollection(client, "MyCollection2"); 
   } 
}

Cuando se ejecuta el código, produce la siguiente salida.

**** Delete Collection MyCollection1 in mydb **** 
Deleted collection MyCollection1 from database myfirstdb 
 
**** Delete Collection MyCollection2 in mydb **** 
Deleted collection MyCollection2 from database myfirstdb

Echemos un vistazo a otro ejemplo. Podemos escribir una consulta que tome el apellido y el estado de la dirección como parámetros, y luego la ejecute para varios valores de lastname y location.state según la entrada del usuario.

SELECT *  
FROM Families f 
WHERE f.lastName = @lastName AND f.location.state = @addressState

Esta solicitud se puede enviar a DocumentDB como una consulta JSON parametrizada como se muestra en el siguiente código.

{       
   "query": "SELECT * FROM Families f WHERE f.lastName = @lastName AND 
      f.location.state = @addressState", 
		
   "parameters": [           
      {"name": "@lastName", "value": "Wakefield"},          
      {"name": "@addressState", "value": "NY"},            
   ]  
}