4

興味深いストアド プロシージャを見つけたので、これを理解するためにあなたの助けが必要です。

基本的に、ストアド プロシージャはSELECTWHERE条件が次のような条件付きです。

WHERE SomeType = 2

SomeTypeなどの値を含むchar(3)列です。'1','2','AA','AB'

SSMS でストアド プロシージャを実行すると、次のエラーで失敗します。

メッセージ 245、レベル 16、状態 1、行 1
varchar 値 'AA' をデータ型 int の列に変換中に構文エラーが発生しました。

ただし、本番環境のアプリでそのストアド プロシージャを使用すると、問題なくデータが返されます。

私の質問は、それはどのように可能ですか?

4

3 に答える 3

2

不正なコードが実行されないように、アプリがさまざまなパラメーターを使用して SP を呼び出している可能性があります。または、アプリがエラーを無視する場合もあります。

于 2012-04-18T08:03:01.663 に答える
2

コメントで、表示されてWHEREいない追加の条項があると言っています。

問題は、異なる実行計画である可能性があります。たとえば、あなたの本当のWHERE状態が

WHERE SomeType = 2 AND Foo = 'X'

そしてあなたのデータは

SomeType Foo
-------- ----
1        X
2        X
AA       Y
AB       Y

次に、あるインスタンスでは、最初に Foo = 'X' を評価して行を残すことがあります

SomeType Foo
-------- ----
1        X
2        X

次に、IMPLICIT_CAST(SomeType AS INT) = 2フィルタリングされたこれらの行に対して問題なく条件を実行します。

ただし、最初に条件を評価するように順序が逆になっている場合は、値をSomeType = 2キャストする必要があり、クエリは失敗します。AAABint

于 2012-04-19T05:49:25.457 に答える
0

に変換intするCharと、うまくいくと思います。

于 2012-04-18T14:18:47.360 に答える