問題タブ [table-valued-parameters]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
sql-server-2008 - プロシージャのテーブル値パラメーターの ID 列、DataTable の定義方法
"[int] IDENTITY(1,1)" 型の列を持つ "table" 型のパラメーターをプロシージャに渡し、入力パラメーターとして渡された DataTable オブジェクトを使用してこのストアド プロシージャを実行することは可能ですか?
次のエラーが表示されます:「ID 列への INSERT は、テーブル変数では許可されていません。テーブル値パラメーター \"@xxxxx\" のデータは、パラメーターのテーブル型に準拠していません。」
私が見つけた唯一の関連コメントは、「テーブル値パラメーターで ID 列の値を指定する場合は、セッションに対して SET IDENTITY_INSERT ステートメントを発行する必要があります」でした。
table パラメーターに PK が設定されていなくても、ある時点で自動的に設定されるようです。それはどこで起こり、どのように回避できますか?
sql - CASE を使用して動的 SQL を削減し、「IN」を使用するかどうか
以前に文字列として記述したストアド プロシージャを変換し、BIT パラメータを使用して、特定の WHERE/ON 句を追加するかどうかを決定しました。
この sp には、いくつかのコンマ区切りの文字列が渡され、動的 WHERE 句の一部は次のようになります。
この場合、@pComma_Separated_List_A は '1,3,6,66,22' のようなものです ... 含めたいもののリストです。
今、これらを文字列から TVP に変更しているので、AND [FIELD_A] IN (SELECT [TVP_FIELD] FROM @pTVP_A) のような「実際の」SQL を使用できます。
これを行うと、文字列を構築する方法が好きではありません
ただし、IF ステートメントをネストする必要もありません。
追加するパラメータが増えるほど、複雑になります。
私がむしろやりたいことは、次のようなものです:
選択した「IF」結果以外のSQLを無視したことは知っていますが、重複したステートメントがすべてずさんなようです
asp.net - TVP を受け入れるように ASP.NET SQL データソースを設定する方法
分離コードでは、ストアド プロシージャの SqlDbType.Structured として TVP を追加しますが、これは ASP.NET SqlDataSource コントロールには存在しません。
Datatables をセッション変数に保存しました (小さいので心配しないでください!)。それらをパラメーターとして SqlDataSource (多数のデータバインド オブジェクトを持つ) に渡す必要があります。
Datasource をセッション変数に指定しましたが、テーブル型への変換に失敗します。
編集:セッション変数を方程式から外したとしましょう(実際には、完全に接しているため)
DBType.Structured を SQLDataSource にアタッチする方法が必要です。リストビューは適切にデータバインドされていますが、それらが接続されているストア プロシージャは TVP を使用する必要があります
SQLDataSource の TVP パラメータを送信する方法がないとは信じられませんか? 私の代替手段は何ですか?
EDIT2: SqlDataSource のカスタム パラメーターの作成を検討してきましたが、その「eval」メソッドが構造化されたデータ型に満足できないように思えます
EDIT3: 私の唯一のオプションは、データ バインドされたコントロールのコード ビハインドですべての作業を行うことであると思われ始めています。他の誰かがエレガントなソリューションを持っている場合に備えて、賞金を追加しました。
EDIT4:おそらく、テーブルをオブジェクトとしてストアド プロシージャに渡し、SQL Server でそれを TVP に変換する方法はありますか?
c# - データ行のリストを使用してデータを格納する
私は2つのクラスの間にマスターとディテールの関係があります。マスタークラスには、多くの詳細のリストが含まれます。現在使用していた
マスタークラス内。このクラスを保存している間、spに渡す前に詳細リストのデータテーブルを使用する必要があります。(sql2008でテーブル値パラメーターを使用しているため)。tvpを使用する理由は、1つのマスターに10k以上の詳細を含めることができ、tvpはそのすべての情報をデータベースに非常に高速にダンプする非常に効率的な方法であるためです。
Qs:データベースを挿入するためにリストをデータテーブルに変換すると、同じデータに対して2倍のメモリ使用量が発生します。データテーブルを直接使用する以外に、マスターに詳細を保存するためのより良い方法はありますか?
Qs:次のオプションは、リストの詳細を使用して、datatable.ImportRow(row)を実行することでした。しかし、列を定義せずにデータを行に追加する方法がわかりません。また、外部オブジェクトがそのようなリストの個々の詳細フィールドにアクセスする方法もわかりません。
casperOneの回答に従って、私はこの方法を使用し、IEnumerable<SqldataRecord>
ストリーミングによってデータを挿入することができ、メモリ内に追加のデータテーブルを作成する必要はありませんでした。同様の解決策を探している他の人に役立つように、以下のコードを投稿しています。
.net - 空のリストまたは null 値をストアド プロシージャのテーブル値パラメーターにバインドする (.NET)
type の単一の列を持つテーブルであるテーブル値パラメーターを受け取るストアド プロシージャを作成しましたint
。ID のリストをストア プロシージャに単純に渡し、ストアド プロシージャがデータを処理できるようにするという考え方です。ただし、渡すデータがない場合、問題が発生します (データがあると正しく動作します)。を に変換し、List<int>
それIEnumerable<SqlDataRecord>
をストアド プロシージャのテーブル値パラメータにバインドしています。空の をバインドしようとしList<SqlDataRecord>
ましたが、エラーが発生しました:
System.ArgumentException: SqlDataRecord 列挙にレコードがありません。行のないテーブル値パラメーターを送信するには、代わりに値に null 参照を使用します。
次に、null値をバインドしようとしました(上記のメッセージが得られたものだと思いました)が、別のエラーメッセージが表示されるだけでした
System.NotSupportedException: パラメータ '@MainItemIdList' の DBNull 値はサポートされていません。テーブル値パラメーターを DBNull にすることはできません。
ストアド プロシージャの宣言で、テーブル値パラメーターを null 許容として宣言できるようには見えません。空のリストをテーブル値パラメータにバインドする正しい方法は何ですか?
sql-server - `SqlDbType.Structured` を使用して NHibernate でテーブル値パラメーターを渡すことは可能ですか?
NHibernate を使用してマップされるストアド プロシージャに ID のコレクションを渡したいと考えています。この手法は、Sql Server 2008 で導入されました (詳細はこちら =>テーブル値パラメーター)。nvarchar
パラメータ内で複数の ID を渡してから、SQL Server 側でその値をチョップしたくないだけです。
vb.net - テーブル値パラメータ欠測データテーブルデータ
私はSQLServerのTVPを初めて使用し、基本を理解しようとしています。SQLExpressのNorthwindデータベースにサンプルTVPを作成しました。VB.NETからの私のコードはかなり単純です(以下を参照)。プロシージャのTVPパラメータは空です。SQL ServerでTVPをテストしましたが、正常に動作します。何か案は?SQL Expressはテーブル値パラメータを完全にサポートしていますか?
sql - SQL @tables をメンバーとして持つ UDT を作成する
SQL Server 2008 のメンバーがテーブル変数になる CLR ユーザー定義型を作成できるかどうか疑問に思います。
ご存じのとおり、テーブル変数を宣言できます。
だから私はいくつかのメンバーを持つUDTが好きで、それぞれがそのように定義されたテーブルです(もちろん別のテーブルです)ので、次のように言うことができます:
また
私はこれについてあまりにも多くを望んでいると感じていますが、インターネット上で明確なYesまたはNoを見つけることができないようです.
それはまったく可能ですか?
sql - クエリ フィルタリングが思い通りに機能しない
フィルタリングする方法は 3 つあります。
- 名前で
- リスト別
- そしてすべて表示
ASP.NET 3.5 と SQL Server 2008 を使用しています。ADO.NET とストアド プロシージャを使用しています。
リストをテーブル値パラメーターとして渡し (ただし、テーブル変数でテストしています)、名前を nvarchar として渡します。ISNULL(@var, column) = column として「すべて表示」しています。明らかに、私がこれを照会している方法は、短絡を利用していないか、WHERE 句がどのように機能するかについての私の理解が欠けています。@var = 'some string' を作成し、テーブル変数に null を挿入すると、正しくフィルタリングされます。@var = null を作成し、テーブル変数に「何らかの文字列」を挿入すると、「何らかの文字列」を取得する必要があるすべてのレコードが取得されます。
コード:
これが私が思いついたものです。醜いけど……。
Ok。私はそれを手に入れたと思います。@resp1 は不要だったので削除し、テーブル値パラメーター @usersTable を使用しているだけです (ただし、ここではテスト用にテーブル変数を使用しています)。フラグ @filterPick を追加したので、@usersTable の値のみ、またはanswers.taskAction = 1 のすべてのレコードを表示できます。
コード:
c# - テーブル値パラメーターの ADO.NET XML 型の列
これは実際には質問ではなく、助けが見つからなかった問題なので、他の誰かが遭遇した場合に備えて、最終的に見つけた解決策を投稿すると思いました.
問題は、SQL Server 2008 ストアド プロシージャに渡していた TVP パラメータの XML 型の列にありました。ExecuteNonQuery() を呼び出すと、次のようなエラーが発生しました
追加情報: XML 解析: (行番号何とか何とか) エンコーディングを切り替えることができません (何とか何とか)
これは、XML が通常どおり UTF-8 として指定されたためです。
<?xml version="1.0" encoding="UTF-8" ?>
ただし、.NET の文字列は UTF-16 です。解決策は、DataTable で XML を含む列をバイト配列として宣言することでした。
次に、行を追加するときに UTF-8 バイトを取得します。
ADO.NET エンジンは、バイトを XML に変換する方法を認識しています。それが誰かを助けることを願っています!