Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Czy z platformy .NET mogę uzyskać pełny ciąg SQL wygenerowany przez obiekt SqlCommand (z parametrami SQL)?

Prosta pętla zastępująca wszystkie nazwy parametrów ich wartościami zapewni coś podobnego do końcowego wyniku, ale jest kilka problemów.

  1. Ponieważ SQL nigdy nie jest odbudowywany przy użyciu wartości parametrów, takie rzeczy jak znaki nowej linii i cudzysłowy nie muszą być brane pod uwagę
  2. Nazwy parametrów w komentarzach nigdy nie są przetwarzane ze względu na ich wartość, ale pozostawiane bez zmian

Mając je na miejscu i biorąc pod uwagę nazwy parametrów, które zaczynają się od tych samych znaków, np. @NAME i @NAME_FULL , możemy zastąpić wszystkie nazwy parametrów wartościami, które byłyby w miejscu tego parametru:

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

pozostaje jednak jeden problem, a mianowicie, że jeśli parametr jest łańcuchem, to SQL, który początkowo wygląda tak:

SELECT * FROM yourtable WHERE table_code = @CODE

będzie wyglądać tak:

SELECT * FROM yourtable WHERE table_code = SOME CODE WITH SPACES

Oczywiście nie jest to legalny SQL, więc musimy uwzględnić również niektóre typy parametrów:

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. Przenieś dane z jednej bazy danych do innej bazy danych

  2. Jak zmusić garbage collector do zakończenia pracy z najwyższym priorytetem?

  3. Konwertuj nazwę miesiąca na numer miesiąca w programie SQL Server (T-SQL)

  4. Zaktualizuj podciąg kolumny

  5. Pytanie o wydajność na pierwszym miejscu w programie SQL Server HierarchyID