212 votes

Obtenir la requête SQL générée à partir d’un objet SqlCommand ?

J’ai le code suivant :

Je me demande si il est possible d’obtenir le dernier SQL-relevés sous forme de chaîne, qui devrait ressembler à ceci :

Si quelqu'un se demande pourquoi je ferais ceci :

  • pour l’enregistrement des déclarations (échecs)
  • pour avoir la possibilité de copier-coller à Enterprise Manager pour des fins de test

143voto

Kon Points 16125

Aux fins de l’enregistrement, j’ai peur, il n’existe aucun moyen plus agréable de faire cela, mais pour construire la chaîne vous-même :

Désolé, j’ai oublié... ``devrait faire le travail.

124voto

Flapper Points 945

Tout n'est pas parfait, ici est quelque chose qui m'a frappé quelque chose pour TSQL - peut être facilement modifié pour d'autres saveurs... Si rien d'autre, il vous donnera un point de départ pour vos propres améliorations :)

Ce n'est un OK de travail sur les types de données et les paramètres de sortie etc similaire à l'aide de "exécuter la procédure stockée" dans SSMS. Nous avons surtout utilisé SPs de sorte que le "texte" de la commande ne tient pas compte de paramètres, etc

    public static String ParameterValueForSQL(this SqlParameter sp)
    {
        String retval = "";

        switch (sp.SqlDbType)
        {
            case SqlDbType.Char:
            case SqlDbType.NChar:
            case SqlDbType.NText:
            case SqlDbType.NVarChar:
            case SqlDbType.Text:
            case SqlDbType.Time:
            case SqlDbType.VarChar:
            case SqlDbType.Xml:
            case SqlDbType.Date:
            case SqlDbType.DateTime:
            case SqlDbType.DateTime2:
            case SqlDbType.DateTimeOffset:
                retval = "'" + sp.Value.ToString().Replace("'", "''") + "'";
                break;

            case SqlDbType.Bit:
                retval = (sp.Value.ToBooleanOrDefault(false)) ? "1" : "0";
                break;

            default:
                retval = sp.Value.ToString().Replace("'", "''");
                break;
        }

        return retval;
    }

    public static String CommandAsSql(this SqlCommand sc)
    {
        StringBuilder sql = new StringBuilder();
        Boolean FirstParam = true;

        sql.AppendLine("use " + sc.Connection.Database + ";");
        switch (sc.CommandType)
        {
            case CommandType.StoredProcedure:
                sql.AppendLine("declare @return_value int;");

                foreach (SqlParameter sp in sc.Parameters)
                {
                    if ((sp.Direction == ParameterDirection.InputOutput) || (sp.Direction == ParameterDirection.Output))
                    {
                        sql.Append("declare " + sp.ParameterName + "\t" + sp.SqlDbType.ToString() + "\t= ");

                        sql.AppendLine(((sp.Direction == ParameterDirection.Output) ? "null" : sp.ParameterValueForSQL()) + ";");

                    }
                }

                sql.AppendLine("exec [" + sc.CommandText + "]");

                foreach (SqlParameter sp in sc.Parameters)
                {
                    if (sp.Direction != ParameterDirection.ReturnValue)
                    {
                        sql.Append((FirstParam) ? "\t" : "\t, ");

                        if (FirstParam) FirstParam = false;

                        if (sp.Direction == ParameterDirection.Input)
                            sql.AppendLine(sp.ParameterName + " = " + sp.ParameterValueForSQL());
                        else

                            sql.AppendLine(sp.ParameterName + " = " + sp.ParameterName + " output");
                    }
                }
                sql.AppendLine(";");

                sql.AppendLine("select 'Return Value' = convert(varchar, @return_value);");

                foreach (SqlParameter sp in sc.Parameters)
                {
                    if ((sp.Direction == ParameterDirection.InputOutput) || (sp.Direction == ParameterDirection.Output))
                    {
                        sql.AppendLine("select '" + sp.ParameterName + "' = convert(varchar, " + sp.ParameterName + ");");
                    }
                }
                break;
            case CommandType.Text:
                sql.AppendLine(sc.CommandText);
                break;
        }

        return sql.ToString();
    }

cela génère une sortie le long de ces lignes...

use dbMyDatabase;
declare @return_value int;
declare @OutTotalRows   BigInt  = null;
exec [spMyStoredProc]
    @InEmployeeID = 1000686
    , @InPageSize = 20
    , @InPage = 1
    , @OutTotalRows = @OutTotalRows output
;
select 'Return Value' = convert(varchar, @return_value);
select '@OutTotalRows' = convert(varchar, @OutTotalRows);

54voto

Tomalak Points 150423

Vous ne pouvez pas, parce qu’il ne génère pas de n’importe quel SQL.

La requête paramétrée (celui de `` ) est envoyé à SQL Server comme l’équivalent d’une instruction préparée. Lorsque vous exécutez la commande, les paramètres et le texte de la requête sont traités séparément. À aucun moment une chaîne complète de SQL est générée.

Vous pouvez utiliser générateur de profils SQL pour jeter un oeil dans les coulisses.

33voto

Mitch Points 5201

J’avais besoin d’une commande similaire au transformateur de chaîne pour permettre une journalisation plus documentée, j’ai donc écrit celui-ci. Il va produire du texte requis pour réexécuter la commande d’une nouvelle session, y compris les paramètres de sortie et structuré. Elle est légèrement testée, mais caveat emptor.

Exemple :

produira :

Mise en œuvre :

5voto

Mr. Brownstone Points 3692

Si vous utilisez SQL Server, vous pouvez utiliser le générateur de profils SQL Server (si vous en avez un) pour afficher la chaîne de commande qui est réellement exécutée. Ce serait utile pour copier/coller, tests purpuses, mais pas pour l’enregistrement, j’ai peur.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X