sql >> Databasteknik >  >> RDS >> Sqlserver

Från .NET kan jag få hela SQL-strängen genererad av ett SqlCommand-objekt (med SQL-parametrar)?

En enkel loop som ersätter alla parameternamn med deras värden ger dig något som liknar slutresultatet, men det finns flera problem.

  1. Eftersom SQL faktiskt aldrig byggs om med parametervärdena behöver inte saker som nya rader och citattecken beaktas
  2. Parameternamn i kommentarer bearbetas aldrig för sitt värde, utan lämnas som de är

Med de på plats och med hänsyn till parameternamn som börjar med samma tecken, som @NAME och @NAME_FULL , kan vi ersätta alla parameternamn med värdet som skulle vara i stället för den parametern:

string query = cmd.CommandText;
foreach (SqlParameter p in cmd.Parameters.OrderByDescending(p => p.ParameterName.Length))
{
    query = query.Replace(p.ParameterName, p.Value.ToString());
}

Det finns dock ett problem kvar med detta, och det är om en parameter är en sträng, då ser SQL-koden som initialt ser ut så här:

SELECT * FROM yourtable WHERE table_code = @CODE

kommer att se ut så här:

SELECT * FROM yourtable WHERE table_code = SOME CODE WITH SPACES

Detta är helt klart inte laglig SQL, så vi måste ta hänsyn till vissa parametertyper också:

DbType[] quotedParameterTypes = new DbType[] {
    DbType.AnsiString, DbType.Date,
    DbType.DateTime, DbType.Guid, DbType.String,
    DbType.AnsiStringFixedLength, DbType.StringFixedLength
};
string query = cmd.CommandText;

var arrParams = new SqlParameter[cmd.Parameters.Count];
cmd.Parameters.CopyTo(arrParams, 0);

foreach (SqlParameter p in arrParams.OrderByDescending(p => p.ParameterName.Length))
{
    string value = p.Value.ToString();
    if (quotedParameterTypes.Contains(p.DbType))
        value = "'" + value + "'";
    query = query.Replace(p.ParameterName, value);
}


  1. MySQL:Transaktioner vs låsningstabeller

  2. Sampling från Oracle, behöver exakt antal resultat (exempelklausul)

  3. Hur man validerar ÅÅÅÅMMDD datum angivet som parameter PL/SQL

  4. ScaleGrid lägger till Oracle Cloud för Managed Database Hosting