Tengo el siguiente código:
Using cmd As SqlCommand = Connection.CreateCommand
cmd.CommandText = "UPDATE someTable SET Value = @Value"
cmd.CommandText &= " WHERE Id = @Id"
cmd.Parameters.AddWithValue("@Id", 1234)
cmd.Parameters.AddWithValue("@Value", "myValue")
cmd.ExecuteNonQuery
End Using
Me pregunto si hay alguna forma de obtener el estado final de SQL como una cadena, que debería verse así:
UPDATE someTable SET Value = "myValue" WHERE Id = 1234
Si alguien se pregunta por qué haría esto:
- para las declaraciones de registro (fallidas)
- por tener la posibilidad de copiarlo y pegarlo en el Administrador corporativo para fines de prueba
Respuestas:
Si bien no es perfecto, aquí hay algo que aproveché para TSQL: podría modificarse fácilmente para otros sabores ... Si nada más, le dará un punto de partida para sus propias mejoras :)
Esto hace un buen trabajo en los tipos de datos y parámetros de salida, etc. similar al uso de "ejecutar procedimiento almacenado" en SSMS. Principalmente utilizamos SP, por lo que el comando "texto" no tiene en cuenta los parámetros, etc.
esto genera resultados a lo largo de estas líneas ...
fuente
ToBooleanOrDefault
aquí: Pregunta # 3244850Para fines de registro, me temo que no hay mejor manera de hacer esto que construir la cadena usted mismo:
fuente
query = Regex.Replace(query, @"\b" + p.ParameterName + @"\b", p.Value.ToString());
para reemplazar los parámetros en la cadena. Esto reemplazará la 'palabra completa'. Sin embargo, podría no ser una solución universal ya que \ b marca una posición entre un carácter de palabra y un carácter que no es de palabra, por lo que en caso de que los nombres de sus parámetros comiencen con @, debe usarp.ParameterName + @"\b"
para reemplazar el parámetro en la cadena de consulta.No puede, porque no genera ningún SQL.
La consulta parametrizada (la que está dentro
CommandText
) se envía al SQL Server como el equivalente de una declaración preparada. Cuando ejecuta el comando, los parámetros y el texto de la consulta se tratan por separado. En ningún momento se genera una cadena SQL completa.Puede usar SQL Profiler para echar un vistazo detrás de escena.
fuente
Necesitaba un comando similar al transformador de cadena para permitir un registro más detallado, así que escribí este. Producirá el texto necesario para volver a ejecutar el comando en una nueva sesión, incluidos los parámetros de salida y los parámetros estructurados. Está ligeramente probado, pero se recomienda.
Ejemplo:
Producirá:
Implementación:
fuente
N
prefijo.También tuve este problema en el que algunas consultas parametrizadas o sp me daban una SqlException (principalmente la cadena o los datos binarios se truncarían), y las declaraciones eran difíciles de depurar (hasta donde sé, actualmente no hay soporte para sql-profiler para SQL Azure)
Veo mucho código simular en las reacciones aquí. Terminé poniendo mi solución en un proyecto Sql-Library para uso futuro.
El generador está disponible aquí: https://github.com/jeroenpot/SqlHelper/blob/master/Source/Mirabeau.MsSql.Library/SqlGenerator.cs
Es compatible con CommandType.Text y CommandType.StoredProcedure
Y si instala el paquete nuget, puede generarlo con esta declaración:
fuente
Si está utilizando SQL Server, podría usar el SQL Server Profiler (si lo tiene) para ver la cadena de comandos que realmente se ejecuta. Eso sería útil para copiar / pegar pruebas de propósitos pero no para iniciar sesión, me temo.
fuente
Respuesta tardía, lo sé, pero yo también quería esto para poder registrar el SQL. Lo siguiente es breve y satisface mis necesidades.
Lo siguiente produce SQL que puede copiar / pegar en SSMS (reemplaza los parámetros con los valores correctamente). Puede agregar más tipos, pero esto cumple con todo lo que uso en este caso.
Ahora puedo registrar el SQL justo antes de ejecutarlo:
fuente
Profiler es sin duda tu mejor opción.
Es posible que deba copiar un conjunto de declaraciones del generador de perfiles debido a los pasos de preparación + ejecución involucrados.
fuente
Tenía la misma pregunta exacta y, después de leer estas respuestas, decidí por error que no era posible obtener la consulta resultante exacta. Estaba equivocado.
Solución: Abrir
Activity Monitor
enSQL Server Management Studio
, reducir la sección de procesos para el nombre de usuario de inicio de sesión, base de datos o nombre de la aplicación que la aplicación está utilizando en la cadena de conexión. Cuando se realiza la llamada a la actualización de dbActivity Monitor
. Cuando vea el proceso, haga clic derecho sobre él yView Details
.Tenga en cuenta que esta puede no ser una opción viable para una base de datos ocupada. Pero debería poder reducir considerablemente el resultado utilizando estos pasos.
fuente
Usé parte del código de Flapper para mi solución, que devuelve toda la cadena SQL, incluidos los valores de los parámetros para ejecutar en MS SQL SMS.
fuente
Mi solución:
fuente
Escribí este método para mí. Yo uso alguna parte del código de Bruno Ratnieks . Quizás sea útil para alguien.
fuente
Si solo se trata de verificar cómo se formatea un parámetro en la consulta de resultados, la mayoría de los DBMS permitirán consultar literales desde cero. Así:
De esa manera puede ver si las cotizaciones se duplican, etc.
fuente
Esto es lo que uso para generar listas de parámetros para un procedimiento almacenado en la consola de depuración:
Esto generará una salida de consola similar a esto:
Coloco este código directamente debajo de cualquier procedimiento que deseo depurar y es similar a una sesión de perfil SQL pero en C #.
fuente
Versión modificada de la respuesta de Kon, ya que solo funciona parcialmente con parámetros con nombre similares. La desventaja de usar la función Reemplazar cadena. Aparte de eso, le doy crédito completo en la solución.
fuente
Esta solución funciona para mí en este momento. Tal vez sea útil para alguien. Por favor disculpe toda la redundancia.
fuente
Como @pkExec y @Alok mencionaron, el uso Reemplazar no funciona en el 100% de los casos. Esta es la solución que he usado en nuestro DAL que usa RegExp para "hacer coincidir palabras completas" y formatear los tipos de datos correctamente. Por lo tanto, el SQL generado se puede probar directamente en MySQL Workbench (o SQLSMS, etc.) :)
(Reemplace la función MySQLHelper.EscapeString () de acuerdo con el DBMS utilizado).
Ejemplo:
Se generará:
fuente
las consultas de comandos sql se ejecutarán con exec sp_executesql, así que aquí hay otra forma de obtener la declaración como una cadena (método de extensión SqlCommand):
fuente
necesitaba cubrir procedimientos no almacenados también, así que aumenté la biblioteca CommandAsSql (vea los comentarios en la respuesta de @ Flapper arriba) con esta lógica:
la solicitud de extracción está en: https://github.com/jphellemons/CommandAsSql/pull/3/commits/527d696dc6055c5bcf858b9700b83dc863f04896
la idea de Regex se basó en los comentarios de @ stambikk y EvZ anteriores y en la sección "Actualización:" de https://stackoverflow.com/a/2544661/903783 que menciona la "afirmación negativa". El uso de \ B en lugar de \ b para la detección de límites de palabras al comienzo de la expresión regular se debe a que p.parameterName siempre comenzará con una "@" que no es un carácter de palabra.
tenga en cuenta que ParameterValueForSQL () es un método de extensión definido en la biblioteca CommandAsSql para manejar problemas como valores de parámetros de cadena de comillas simples, etc.
fuente
Si va a convertir el texto del comando:
Ahora puede obtener el texto de comando que no es de parámetro de la siguiente manera:
y el resultado es "ACTUALIZAR someTable SET Value = 'myValue' WHERE Id = 1234" sin parámetro más
fuente
Código extendido de Kon para ayudar a depurar un procedimiento almacenado:
En mi primer caso de prueba, generó:
Probablemente necesitará agregar algunas asignaciones de tipo "..is ..." más condicionales, por ejemplo, para fechas y horas.
fuente
Un trazador de líneas:
fuente
De comando de parámetro a comando sin parámetro, puede cambiar este
A
fuente