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

Lỗi 'Phải khai báo biến vô hướng' khi chuyển tham số có giá trị bảng sang câu lệnh SQL được tham số hóa

Điều đầu tiên trước tiên:Tôi không biết bạn đang lấy tableName ở đâu và columnName , nhưng nếu chúng do người dùng cung cấp, thì điều này sẽ mở cho SQL injection. Ít nhất, hãy sử dụng QUOTENAME() để đảm bảo không có mã thực nào được đưa vào.

Thứ hai, bạn không thực sự sử dụng TVP. Mã bạn có chỉ là IN (@IDTable) đó không phải là cách bạn sử dụng TVP.

TVP chỉ là một biến bảng và nên được sử dụng giống như bất kỳ bảng nào khác:

protected virtual void DoDeleteRecords(List<Guid> ids)
{   
    if (ids.Count == 0)
        return;
    DataTable tvp = new DataTable();
    tvp.Columns.Add("Id", typeof(Guid));

    foreach (Guid id in ids)
        tvp.Rows.Add(id);

    const string sql = @"
DELETE FROM table
WHERE idColumnName IN (SELECT * FROM @IDTable);
";

    using(SqlConnection connection = new SqlConnection(CoreSettings.ConnectionString))
    using(SqlCommand command = new SqlCommand(sql, connection))
    {
        command.Parameters.Add(
            new SqlParameter("@IDTable", SqlDbType.Structured)
        {
            Value = tvp,
            Direction = ParameterDirection.Input,
            TypeName = "dbo.IDList"
        });

        connection.Open();
        command.ExecuteNonQuery();
    }
}



  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 khắc phục “Chuyển đổi không thành công khi chuyển đổi giá trị thành kiểu dữ liệu” trong SQL Server

  2. Bỏ khóa ngoại mà không biết tên của ràng buộc?

  3. Ưu điểm về hiệu suất của SQL Server 2016 Enterprise Edition

  4. Làm cách nào để lấy danh sách ID từ bảng SQL dưới dạng chuỗi giá trị được phân tách bằng dấu phẩy?

  5. Cách chuyển đổi DateTime thành TimeSpan trong truy vấn Entity Framework