Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Kesalahan 'Harus Mendeklarasikan Variabel Skalar' Saat Melewati Parameter Bernilai Tabel ke Pernyataan SQL Berparameter

Hal pertama yang pertama:Saya tidak tahu dari mana Anda mendapatkan tableName dan columnName , tetapi jika disediakan oleh pengguna, maka ini terbuka untuk injeksi SQL. Paling tidak, gunakan QUOTENAME() untuk memastikan tidak ada kode aktual yang disuntikkan.

Kedua, Anda tidak benar-benar menggunakan TVP. Kode yang Anda miliki hanya mengatakan IN (@IDTable) yang bukan cara Anda menggunakan TVP.

TVP hanyalah variabel tabel, dan harus digunakan seperti tabel lainnya:

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. Secara otomatis menyelesaikan konflik penggabungan kunci utama

  2. Memesan hasil SQL Server dengan klausa IN

  3. Urutan Instal yang Tepat Untuk Visual Studio 2010 dengan SQL Server 2008 dan Office 2007?

  4. Pentingnya log transaksi di SQL Server

  5. Dapatkan hasil dari SQL dinamis dalam prosedur tersimpan