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

Грешка „Трябва да декларира скаларната променлива“ при предаване на параметър с таблична стойност към параметризиран SQL оператор

Най-напред:нямам представа откъде получавате tableName и columnName , но ако те са предоставени от потребителя, тогава това е отворено за SQL инжектиране. Най-малкото използвайте QUOTENAME() за да се гарантира, че не се инжектира действителен код.

Второ, вие всъщност не използвате TVP. Кодът, който имате, просто казва IN (@IDTable) което не е начинът, по който използвате TVP.

TVP е просто променлива на таблица и трябва да се използва като всяка друга таблица:

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. Конфигуриране на известия за поща в базата данни в MS SQL Server

  2. Как да комбинирате дата от едно поле с време от друго поле - MS SQL Server

  3. Съхранение на UTF-16/Unicode данни в SQL Server

  4. Най-добрият начин да получите идентичност на вмъкнатия ред в свързания сървър?

  5. Използване на IF EXISTS с CTE