Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Từ .NET, tôi có thể lấy chuỗi SQL đầy đủ được tạo bởi một đối tượng SqlCommand (với Tham số SQL) không?

Một vòng lặp đơn giản thay thế tất cả các tên tham số bằng các giá trị của chúng sẽ cung cấp cho bạn điều gì đó tương tự như kết quả cuối cùng, nhưng có một số vấn đề.

  1. Vì SQL thực sự không bao giờ được xây dựng lại bằng cách sử dụng các giá trị tham số, những thứ như dòng mới và dấu ngoặc kép không cần phải xem xét
  2. Tên thông số trong nhận xét không bao giờ thực sự được xử lý theo giá trị của chúng, nhưng vẫn giữ nguyên trạng thái

Với những điều đó tại chỗ và tính đến tên thông số bắt đầu bằng các ký tự giống nhau, chẳng hạn như @NAME@NAME_FULL , chúng ta có thể thay thế tất cả các tên tham số bằng giá trị ở vị trí của tham số đó:

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

Tuy nhiên, có một vấn đề còn lại với điều này và đó là nếu một tham số là một chuỗi, thì SQL ban đầu trông giống như sau:

SELECT * FROM yourtable WHERE table_code = @CODE

sẽ trông như thế này:

SELECT * FROM yourtable WHERE table_code = SOME CODE WITH SPACES

Đây rõ ràng không phải là SQL hợp pháp, vì vậy chúng tôi cũng cần tính đến một số kiểu tham số:

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. Cách chuyển đổi chữ thường thành chữ hoa trong SQL Server - UPPER ()

  2. Luồng có điều kiện của máy chủ SQL

  3. Debezium:Không có LSN tối đa được ghi trong cơ sở dữ liệu; hãy đảm bảo rằng SQL Server Agent đang chạy

  4. Kiểu dữ liệu Địa lý SQL Server điểm gần nhất trên dòng

  5. Thêm khóa chính vào bảng hiện có