Eu tenho o seguinte 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
Gostaria de saber se existe alguma maneira de obter a declaração SQL final como uma String, que deve ser assim:
UPDATE someTable SET Value = "myValue" WHERE Id = 1234
Se alguém se pergunta por que eu faria isso:
- para instruções de log (com falha)
- por ter a possibilidade de copiar e colar no Enterprise Manager para fins de teste
Respostas:
Embora não seja perfeito, aqui está uma coisa que eu escrevi para o TSQL - poderia ser facilmente alterada para outros sabores ... Se nada mais, isso lhe dará um ponto de partida para suas próprias melhorias :)
Isso faz um trabalho OK em tipos de dados e parâmetros de saída, etc., semelhante ao uso de "executar procedimento armazenado" no SSMS. Usamos principalmente SPs para que o comando "text" não leve em consideração parâmetros, etc.
isso gera saída nessas linhas ...
fonte
ToBooleanOrDefault
aqui: Pergunta # 3244850Para fins de registro, receio que não haja uma maneira melhor de fazer isso, a não ser construir a string:
fonte
query = Regex.Replace(query, @"\b" + p.ParameterName + @"\b", p.Value.ToString());
para substituir os parâmetros na cadeia de caracteres. Isso substituirá a 'palavra inteira'. Pode não ser uma solução universal, pois como \ b marca uma posição entre um caractere de palavra e um caractere que não seja uma palavra. No caso de os nomes de parâmetros começarem com @, use-op.ParameterName + @"\b"
para substituir o parâmetro na string de consulta.Você não pode, porque não gera nenhum SQL.
A consulta parametrizada (aquela em
CommandText
) é enviada ao SQL Server como o equivalente a uma instrução preparada. Quando você executa o comando, os parâmetros e o texto da consulta são tratados separadamente. Em nenhum momento, uma sequência SQL completa é gerada.Você pode usar o SQL Profiler para dar uma olhada nos bastidores.
fonte
Eu precisava de um comando semelhante ao transformador de cadeia para permitir um registro mais detalhado, então escrevi este. Ele produzirá o texto necessário para executar novamente o comando em uma nova sessão, incluindo parâmetros de saída e parâmetros estruturados. É levemente testado, mas ressalva.
Exemplo:
Vai produzir:
Implementação:
fonte
N
prefixo.Eu também tive esse problema em que algumas consultas parametrizadas ou sps me dariam uma SqlException (principalmente a string ou os dados binários seriam truncados) e as instruções eram difíceis de depurar (até onde sei, atualmente não há suporte ao sql-profiler para SQL Azure)
Eu vejo muito código semelhante nas reações aqui. Acabei colocando minha solução em um projeto Sql-Library para uso futuro.
O gerador está disponível aqui: https://github.com/jeroenpot/SqlHelper/blob/master/Source/Mirabeau.MsSql.Library/SqlGenerator.cs
Ele suporta CommandType.Text e CommandType.StoredProcedure
E se você instalar o nuget-package, poderá gerá-lo com esta instrução:
fonte
Se você estiver usando o SQL Server, poderá usar o SQL Server Profiler (se houver) para exibir a cadeia de comando que é realmente executada. Isso seria útil para fins de teste de copiar / colar, mas não para o registro, receio.
fonte
Resposta tardia, eu sei, mas eu também queria isso para poder registrar o SQL. O seguinte é breve e atende às minhas necessidades.
A seguir, produz SQL que você pode copiar / colar no SSMS (ele substitui os parâmetros pelos valores corretamente). Você pode adicionar mais tipos, mas isso atende a tudo que uso neste caso.
Agora eu posso registrar o SQL antes de executá-lo:
fonte
Profiler é sem dúvida sua melhor opção.
Pode ser necessário copiar um conjunto de instruções do criador de perfil devido às etapas de preparação + execução envolvidas.
fonte
Eu tinha a mesma pergunta exata e, depois de ler essas respostas, decidi por engano que não era possível obter a consulta exata exata. Eu estava errado.
Solução: Abrir
Activity Monitor
emSQL Server Management Studio
, estreitar a seção de processos para o login de usuário, banco de dados ou o nome do aplicativo que seu aplicativo está usando na cadeia de conexão. Quando a chamada é feita para a atualização do banco de dadosActivity Monitor
. Quando você vir o processo, clique com o botão direito nele eView Details
.Observe que isso pode não ser uma opção viável para um banco de dados ocupado. Mas você deve conseguir restringir o resultado consideravelmente usando essas etapas.
fonte
Utilizei parte do código do Flapper para minha solução, que retorna toda a cadeia SQL, incluindo os valores dos parâmetros a serem executados no MS SQL SMS.
fonte
Minha solução:
fonte
Eu escrevi esse método para mim. Eu uso uma parte do código de Bruno Ratnieks . Talvez seja útil para alguém.
fonte
Se for apenas para verificar como um parâmetro é formatado na consulta de resultado, a maioria dos DBMS permitirá consultar literais do nada. Portanto:
Dessa forma, você pode ver se as cotações estão duplicadas, etc.
fonte
Isto é o que eu uso para gerar listas de parâmetros para um procedimento armazenado no console de depuração:
Isso irá gerar uma saída do console semelhante a esta:
Coloco esse código diretamente abaixo de qualquer procedimento que deseje depurar e é semelhante a uma sessão do sql profiler, mas em C #.
fonte
Versão modificada da resposta do Kon, pois funciona apenas parcialmente com parâmetros nomeados semelhantes. O lado negativo de usar a função String Replace. Fora isso, dou todo o crédito a ele pela solução.
fonte
Esta solução funciona para mim agora. Talvez seja útil para alguém. Por favor, desculpe toda a redundância.
fonte
Como o @pkExec e o @Alok mencionaram, o uso Substituir não funciona em 100% dos casos. Essa é a solução que usei em nosso DAL que usa o RegExp para "corresponder apenas a palavra inteira" e formatar os tipos de dados corretamente. Assim, o SQL gerado pode ser testado diretamente no MySQL Workbench (ou SQLSMS, etc ...) :)
(Substitua a função MySQLHelper.EscapeString () de acordo com o DBMS usado.)
Exemplo:
Será gerado:
fonte
as consultas do comando sql serão executadas com exec sp_executesql, então aqui está outra maneira de obter a instrução como uma string (método de extensão SqlCommand):
fonte
necessário para cobrir também os procedimentos não armazenados, então eu aprimorei a biblioteca CommandAsSql (veja os comentários na resposta do @ Flapper acima) com esta lógica:
a solicitação de recebimento está em: https://github.com/jphellemons/CommandAsSql/pull/3/commits/527d696dc6055c5bcf858b9700b83dc863f04896
a ideia do Regex foi baseada nos comentários de @ stambikk e EvZ acima e na seção "Update:" em https://stackoverflow.com/a/2544661/903783 que menciona "asserção negativa por trás". O uso de \ B em vez de \ b para a detecção do limite de palavras no início da expressão regular ocorre porque o p.parameterName sempre começa com um "@" que não é um caractere de palavra.
Observe que ParameterValueForSQL () é um método de extensão definido na biblioteca CommandAsSql para lidar com problemas como valores de parâmetros de string de aspas simples etc.
fonte
Se você converter o texto do comando:
Agora você pode obter o texto de comando sem parâmetro da seguinte maneira:
e o resultado é "UPDATE someTable SET Value = 'myValue' WHERE Id = 1234" sem mais parâmetro
fonte
Código estendido do Kon para ajudar a depurar um procedimento armazenado:
No meu primeiro caso de teste, ele gerou:
Você provavelmente precisará adicionar algumas atribuições do tipo "..is ..." mais condicionais, por exemplo, para datas e horas.
fonte
Um forro:
fonte
Do comando de parâmetro para o comando não de parâmetro, você pode alterar este
Para
fonte