sql >> Databáze >  >> RDS >> Sqlserver

Chyba „Musí deklarovat skalární proměnnou“ při předávání parametru s hodnotou tabulky do parametrizovaného příkazu SQL

Za prvé:Nemám ponětí, kde získáváte tableName a columnName , ale pokud jsou poskytnuty uživatelem, pak je to otevřené pro SQL injection. Přinejmenším použijte QUOTENAME() abyste zajistili, že nebude vložen žádný skutečný kód.

Za druhé, ve skutečnosti nepoužíváte TVP. Kód, který máte, jen říká IN (@IDTable) což není způsob, jakým používáte TVP.

TVP je pouze proměnná tabulky a měla by se používat jako každá jiná tabulka:

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. Postgres vrací [null] místo [] pro array_agg tabulky spojení

  2. PHP Jak vrátit datetime(6) z Mysql?

  3. SSIS převede Varchar2 na DT_STR

  4. Mysql dotaz k dynamickému převodu řádků na sloupce