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. C#MySql CREATE USER

    2. MySQL LEAST()関数–引数のリストから最小の引数を検索します

    3. MariaDBのデータベースパフォーマンスチューニング

    4. PL / SQL BEFORE UPDATEトリガーで列の値が明示的に指定されているかどうかを確認するにはどうすればよいですか?