Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

От .NET мога ли да получа пълния SQL низ, генериран от SqlCommand обект (с SQL параметри)?

Един прост цикъл, заместващ всички имена на параметри с техните стойности, ще ви осигури нещо подобно на крайния резултат, но има няколко проблема.

  1. Тъй като SQL всъщност никога не се възстановява с помощта на стойностите на параметрите, неща като нови редове и кавички не трябва да се вземат предвид
  2. Имената на параметрите в коментарите всъщност никога не се обработват за тяхната стойност, а се оставят такива, каквито са

С тези на място и като се вземат предвид имена на параметри, които започват със същите знаци, като @NAME и @NAME_FULL , можем да заменим всички имена на параметри със стойността, която би била на мястото на този параметър:

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

остава един проблем с това обаче и това е, че ако даден параметър е низ, тогава SQL, който първоначално изглежда така:

SELECT * FROM yourtable WHERE table_code = @CODE

ще изглежда така:

SELECT * FROM yourtable WHERE table_code = SOME CODE WITH SPACES

Това очевидно не е законен SQL, така че трябва да отчетем и някои типове параметри:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Премахване на един знак от поле varchar SQL Server 2008

  2. Как мога да стартирам само оператора, върху който е курсорът ми, в SQL Server Management Studio?

  3. Как да разберете дали изчислената колона е детерминистична в SQL Server

  4. Каква е възможността на MS SQL Server, подобна на функцията MySQL FIELD()?

  5. Поставяне на безизходна жертва