Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Fehler „Muss Skalarvariable deklarieren“ beim Übergeben eines Tabellenwertparameters an eine parametrisierte SQL-Anweisung

Das Wichtigste zuerst:Ich habe keine Ahnung, woher Sie den tableName bekommen und columnName , aber wenn sie vom Benutzer bereitgestellt werden, ist dies offen für SQL-Injection. Verwenden Sie zumindest QUOTENAME() um sicherzustellen, dass kein tatsächlicher Code eingeschleust wird.

Zweitens verwenden Sie das TVP nicht wirklich. Der Code, den Sie haben, sagt nur IN (@IDTable) So verwenden Sie kein TVP.

Ein TVP ist nur eine Tabellenvariable und sollte wie jede andere Tabelle verwendet werden:

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();
    }
}