2010-06-21 13 views
48

Estoy tratando de hacer que mis pruebas de integración sean más idempotentes. Una idea era ejecutar la reversión después de cada prueba, la otra idea era cómo analizar de forma programática el texto, de forma similar a la casilla de verificación verde en Query Analyzer o SSMS.¿Cómo puedo verificar (analizar) mediante programación la validez de una sentencia de TSQL?

¿Cómo obtengo que SQL Server analice mi comando sin ejecutarlo con ADO.NET?

ACTUALIZACIÓN: Esto es lo que finalmente funcionó como desee:

using (DbCommand executeOnly = Factory.DbCommand()) 
{ 
    executeOnly.Connection = command.Connection; 
    executeOnly.CommandType = CommandType.Text; 
    executeOnly.CommandText = "SET NOEXEC ON;" + sqlCommand; 
    executeOnly.Connection.Open(); 
    executeOnly.ExecuteNonQuery(); 
} 
//set more properties of command. 
command.Execute(); 

Por razones inexplicables, "SET PARSEONLY ON" sólo funcionaba en el Analizador de consultas. No pude configurar esto en una conexión ADO.NET. Es mejor porque PARSEONLY parece captar solo errores de sintaxis, que no es un error común. SET NOEXEC ON detectará una variedad más amplia de errores, como una vista que hace referencia a una tabla o columna faltante o un parámetro faltante en un procedimiento almacenado.

+1

Interesante pregunta de hecho –

+1

Estoy asumiendo que es 'executeOnly.CommandText = "SET NOEXEC ON; "+ sqlCommand;': 3 – Liz

Respuesta

36

Creo que el comando que está buscando es SET NOEXEC ON. Si configura esto para su conexión, las consultas se analizarán pero no se ejecutarán. Otra opción sería SET PARSEONLY ON, pero honestamente no estoy seguro de cuál es la diferencia entre los dos.

+1

+1, [SET NOEXEC (Transact-SQL)] (http://msdn.microsoft.com/en-us/library/ms188394.aspx) –

+4

A continuación de los comentarios debajo de mi respuesta , Creo que podría haber un error con SET NOEXEC ON en SQL 2K8, también ha sido reproducido por otros. Mira el error de MS Connect que he mencionado: https://connect.microsoft.com/SQLServer/feedback/details/ 569263/set-noexec-on-do-not-flag-up-invalid-object-name-errors – AdaTheDev

6

SET PARSEONLY: examina la sintaxis de cada instrucción de Transact-SQL y devuelve los mensajes de error sin compilar ni ejecutar la instrucción.

+0

Esto es lo que hace SSMS cuando se presiona la casilla de verificación verde. Puede ver fácilmente que ocurra en el Analizador de SQL. – deroby

7

utilice la siguiente consulta

SET PARSEONLY ON 
--Your query here 
SET PARSEONLY OFF 
21

+1 a la respuesta de Eric. Pero he encontrado que SET FMTONLY ON también es útil ya que SET NOEXEC ON no parece arrojar todos los errores.

p. Ej.

SELECT * FROM ATableThatDoesNotExist 

Ejecución que con SET NOEXEC ON dice que fue un éxito, a pesar de la tabla no existe en la base de datos. Si lo ejecuta con SET FMTONLY ON, arrojará el error "Nombre de objeto inválido".

SET FMTONLY ON también devuelve metadatos sobre el conjunto de resultados que se devolvería, que puede ser muy útil

+0

I obtener un error al usar 'SET NOEXEC ON' y' SELECT * FROM ATableThatDoesNotExist' –

+0

@KM No obtengo un error en SQL2005 o SQL2008 –

+0

@KM - Igual que Martin, tampoco me sale un error:/ – AdaTheDev

6

Realmente depende de la finalidad de las pruebas.

La forma más confiable sería usar la reversión después de cada prueba si sus declaraciones se prestan a eso (no son demasiado pesadas para hacerlo viable).

He hecho esto en el pasado y me alegro de recibir notificaciones de problemas de tiempo de ejecución que no habría detectado de otra manera.

+0

+1 - Acepto. Ejecutar realmente la instrucción y realizar una reversión posterior será la forma más confiable de probarla. –

+0

+1: 'SET NOEXEC ON' solo está verificando que la consulta sea válida. Una consulta puede ser válida, pero no arrojar resultados correctos. –

8

SQL Server 2012 puede analizar la sintaxis, los procedimientos y las tablas con los siguientes procedimientos y funciones del sistema:

They are supposedly replacing "SET FMTONLY".

los he probado y funcionan mucho mejor que "SET NOEXEC ON" y "SET parseonly ON"

Ejemplos:

no generará un error :

sp_describe_undeclared_parameters 
    @tsql = N'SELECT object_id, name, type_desc FROM sys.indexes;' 

Lanzará correctamente un error ("SET NOEXEC") y "SET parseonly" no generará un error en este caso):

sp_describe_undeclared_parameters 
    @tsql = N'SELECT object_id, name, type_desc FROM sys.indexes;SELECT object_id, name, type_desc FROM sys.NOTaTABLE;' 
Cuestiones relacionadas