問題タブ [sp-executesql]

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.

0 投票する
9 に答える
84299 参照

sql - select...into に対して sp_executeSql を実行しますが、Temp テーブル データを選択できません

sp_Executedsql の一時テーブル #TempTable を選択しようとしていました。正常に挿入されたかどうかはわかりませんが、正常に挿入されたことを意味するメッセージが書き込まれていますか (359 行が影響を受けています)。以下のスクリプト

実行後、メッセージで返されます(359行が影響を受けます)。次に #TempTable からデータを選択しようとするとき。

そのリターン私:

「選択」セクションのみが機能していると思われます。インサートが機能していません。どのように修正しますか?

0 投票する
1 に答える
242 参照

c# - LINQ でのストアド プロシージャの使用

この方法でストアド プロシージャを呼び出すために LINQ を使用したいのですが、呼び出したいストアド プロシージャには、によって実行された SQL 文字列が含まれています。

このように、Visual Studio は結果クラスを生成しません。この問題を解決するには、次の方法で SQL 文字列を実行します

最善の方法ではないかもしれませんが、うまくいきます。問題は、アイテムが間違った順序で返されることがあるということです。修正方法は?

0 投票する
2 に答える
4854 参照

entity-framework - Entity Framework 4.2 exec sp_executesql はインデックスを使用しません (パラメーター スニッフィング)

SQL Server 2008 R2 に対して実行されている Entity Framework (4.2) によって生成された単純な SQL クエリで、重大なパフォーマンスの問題が発生しています。一部の状況 (すべてではない) では、EF は次の構文を使用します。

他の状況では、提供されたパラメーターをクエリに焼き付けて生の SQL を実行するだけです。私が遭遇している問題は、sp_executesql で実行されたクエリがターゲット テーブルのすべてのインデックスを無視しているため、クエリのパフォーマンスが非常に低下していることです (SSMS で実行プランを調べることで確認されています)。

少し調査した結果、この問題は「パラメータ スニッフィング」が原因である可能性があるようです。OPTION(RECOMPILE) クエリ ヒントを追加すると、次のようになります。

ターゲット テーブルのインデックスが使用され、クエリは非常に高速に実行されます。また、データベース インスタンス ( http://support.microsoft.com/kb/980653 ) でパラメーター スニッフィング (4136) を無効にするために使用されるトレース フラグを切り替えようとしましたが、これはまったく効果がないようです。

これにより、いくつかの質問が残ります。

  1. Entity Framework によって生成された SQL に OPTION(RECOMPILE) クエリ ヒントを追加する方法はありますか?
  2. Entity Framework が exec sp_executesql を使用するのを防ぎ、代わりに生の SQL を実行する方法はありますか?
  3. 他の誰かがこの問題に遭遇していますか? 他のヒント/ヒントはありますか?

追加情報:

  1. SSMS を介してデータベース インスタンスを再起動しましたが、サービス管理コンソールからサービスを再起動してみます。
  2. パラメータ化は SIMPLE に設定されます (is_parameterization_forced: 0)
  3. アドホック ワークロードの最適化には、次の設定があります。
    • 値: 0
    • 最小: 0
    • 最大: 1
    • 使用中の値: 0
    • is_dynamic: 1
    • is_advanced: 1

また、以下のスクリプトでトレース フラグ 4136 を有効にした後、サービス管理コンソールを介して SQL Server サービスを再起動すると、実際にはトレース フラグがクリアされているように見えることにも言及する必要があります...おそらく、これを別の方法で行う必要があります...

0 投票する
3 に答える
121 参照

sql-server-2008 - EXECUTESQL エラー

これは、SQL Server で実行しようとしている次のコードです。

これを実行しようとすると、次のようにエラーになります

「キーワード 'as' 付近の構文が正しくありません」

このコードを取り出して個別に実行しましたが、エラーは発生しませんでした。ここで何か不足していますか?

0 投票する
1 に答える
955 参照

sql - sp_executesqlステートメントでパラメーターを明示的に置き換える高速な方法は?

sp_executesqlに渡されたパラメーターを使用していくつかのselectステートメントを実行するプログラムをC#で作成しています。テスト中に遭遇する問題の1つは、SQL Profilerから実行するコマンドを取得する場合でも、Visual Studioのウォッチからコマンドを取得する場合でも、パラメーターの値は、明示的に指定されるのではなく、ステートメントの最後に指定されることです。クエリの行。テストの目的で、パラメーターの代わりにパラメーター値を使用する簡単な方法が必要です。

したがって、代わりに:

が欲しいです:

例の構文は概念を示すために使用されているだけなので、あまり注意を払わないでください。誰かがこれを行うための速い方法を知っていますか?基本的には、条件を変更して、返される結果にどのように影響するかをテストするのが簡単になるため、テスト目的で置き換えてもらいたいと思います。どなたでもお役に立てれば幸いです。ありがとう。

0 投票する
2 に答える
3774 参照

sql - SQL BETWEENを使用して、文字列内の2つの日付を比較し、実行してsp_executesqlにするにはどうすればよいですか?

SQLストアドプロシージャに次のような行があります(意図したとおりに機能します)。

しかし、さらに下に私は次の行を持っています:

@userIDsはIDのコンマ区切り文字列であり、oh.userはINTEGERであるため、SQLクエリ全体を動的文字列(@sql)に入れ、すべてのパラメータを連結してから使用する必要があります。

日付の間を除いてすべてが正常に機能しています。いくつかの方法を試しましたが、エラーが発生し続けるか、次のような場合に結果が返されません。

何も返しません。

また、何も返しません。

DATETIMEを文字列に変換するときにエラーを返します。

どんな助けでも大歓迎です。

ありがとう、トーマス

0 投票する
2 に答える
20150 参照

sql-server - SQL 文字列を実行し、結果をテーブルに挿入する

私はテーブルを持っています

QueryIndex はループ カウンターで、@QueryIndex から値を取得します。FieldValue は別の SQL 文字列から値を取得します。何らかの理由で、SQL 文字列を動的に実行する必要があります。

今、@Resultsにデータを挿入しようとしています

当然のことながら、このコードは機能しません。テーブルにデータを挿入するソリューションを教えてください。どの方法も試してみる価値があります。表の結果は次のようになります。

ありがとう。

0 投票する
3 に答える
5245 参照

sql-server - 別のスコープで作成された SQL Server 一時テーブルにアクセスする

一連のテーブルから情報を抽出する必要がある SQL Server 2008 のストアド プロシージャを作成しています。これらのテーブルの構造を事前に知りません。同じデータベースに別のテーブルがあり、このテーブルのフィールドの名前とタイプを教えてくれます。

私はこれをやっています:

その後、一時テーブルを削除します。これはループで発生するため、テーブルの作成、移入、および削除が何度も行われ、毎回異なる列が使用されます。

これはエラーで失敗します:

無効なオブジェクト名: #new_temporary_table。

いくつかのグーグルの後、私はそれを見つけました:

  1. テーブルは、ストアド プロシージャのスコープとは異なる#new_temporary_table呼び出しのスコープで作成されています。exec sp_executesqlこれが、nextexec sp_executesqlがテーブルを見つけられない理由です。この投稿ではそれについて説明しています: http://social.msdn.microsoft.com/forums/en-US/transactsql/thread/1dd6a408-4ac5-4193-9284-4fee8880d18a

  2. 先頭に .が付加されたグローバル一時テーブルを使用できます##。複数のストアド プロシージャが同時に実行される可能性があり、それらが互いの状態に影響を与える可能性があるため、これを行うことはできません。

  3. この記事では、この状況に陥った場合、データベースの構造を変更する必要があると述べています。これは私にとってオプションではありません: http://www.sommarskog.se/dynamic_sql.html

私が見つけた 1 つの回避策はselect into #new_temporary_table..、すべてのinsert into ...スクリプトを 1 つの巨大なステートメントに結合することでした。これはうまく機能しますが、いくつかの欠点があります。

たとえば、トラブルシューティングのために @sql を出力すると、テキストが切り捨てられます。

他に選択肢はありますか?すべてのアイデアを歓迎します。

0 投票する
2 に答える
38438 参照

sql-server-2008 - SQL Server でテーブル値関数をリモートで呼び出すための回避策には、さらに多くの問題があります

さまざまなパラメーターを使用して複数回実行する必要がある一連のパラメーターを含むクエリがあったため、それをテーブル値関数でラップしました。

そのテーブル値関数は、リモート サーバーから呼び出される必要がありました。残念ながら、リンク サーバーでの呼び出しは次のエラーで失敗します。

Microsoft は、"テーブル値関数をリモートで呼び出す" 機能が SQL Server 2008 から除外されていたことを認めています。 - 通話は許可されていません

OPENQUERY 構文を使用する回避策を発見しました。これにより、クエリをリモート サーバー上でローカルに実行し、結果セットを返すことができます。参照: http://social.msdn.microsoft.com/Forums/en/transactsql/thread/7a6e4aa1-630b-4ad5-aee5-15139987adbd

残念ながら、この回避策には回避策が必要でした。これは、引数として文字列が必要なためです。つまり、OPENQUERY 構文を使用して変数を渡すことはできず、変数を含めたい場合のように、その中に文字列を連結することさえできません。リモート テーブル値関数に渡したい。回避策の回避策は、動的 SQL を使用して OPENQUERY クエリを明示的に構築し、通常の文字列が確実に渡されるようにすることです。参照: http://social.msdn.microsoft.com/Forums/en-US/transactsql/thread/0847ad24-0dfe-4ae1-9788-5516c7830f40/

しかし、このことから別の問題が生じます。すべての引用符、二重引用符、および四重引用符が正しく埋め込まれていることを確認した後でも、すべてを exec sp_executesql を介して渡すことができるため、まだ問題があります。

クエリが最終的にテーブル値関数を呼び出すと、次のエラーが発生します。

ユーザー名のマッピングが存在するため、このエラーが発生する理由がわかりません。テーブル値関数を実際のテーブルに置き換えるだけで、結果が正常に返されます。この問題は、sp_executesql で実行されるかどうかに関係なく、OPENQUERY ステートメントで発生します。前述のとおり、テーブル値関数を呼び出す場合にのみ発生します。

これを解決する方法はありますか?