2017-07-03 13 views
0

私は小さなストアドプロシージャ(SQl Server 2012)を持っています。奇妙なexecとsp_executesqlが異なる動作

私はそれを使用して実行した場合:

exec spSelRegion @bOver21 = 1 

Iゲット私が使用してそれを実行した場合とは異なる結果:

exec sp_executesql N'spSelRegion',N'@bOver21 bit',@bOver21=1 

違いは何ですか?

ALTER PROCEDURE [dbo].[spSelRegion] 
    (
     @ID int = NULL 
     ,@Name varchar(128) = NULL 
     ,@OrderBy varchar(16) = 'ID' 
     ,@bOver21 bit = null 
    ) 
    AS 
    SELECT distinct 
     r.[ID], 
     r.[Name], 
     r.[dInserted], 
     r.[sInserted], 
     r.[dUpdated], 
     r.[sUpdated], 
     r.[timestamp] 
    FROM 
     [dbo].[tblRegion] r 
      left outer join tblCountyRegion cr 
      on r.ID = cr.RegionNbr 
    WHERE 
     (r.[ID] = @ID or @ID is null) 
     AND (r.[Name] = @Name or @Name is null) 
     AND (@bOver21 is null and r.[ID] >20 
     OR (@bOver21 = 1 and r.[ID] > 20 and cr.IsActive=1) 
     OR (@bOver21 = 0 and r.[ID] >= 21 and r.id < 31)) 

私はこれ以上の補完をしたくありません。しかし、今日のマイクロソフトのアップデート後、いくつかのストアドプロシージャはExecの代わりにsp_executesqlを使用して実行され、これが問題の原因です。

+0

どのような違いがありますか? – SchmitzIT

+0

違いは何ですか?違いを知るためにsql profilerを確認できますか? –

答えて

5

パラメータを指定して動的SQLを実行する必要があります。それがなければ、それはヌル値が渡されると仮定します。したがって、これは:

exec sp_executesql N'spSelRegion @bOver21 = @bOver21',N'@bOver21 bit',@bOver21=1 
+0

これも結果を返しません。何かが違う。 –

+0

あなたの例を調整して、それをもっと明示的に設定しました。再試行する。 – Jesse

+0

あなたは正しい、それが原因です。 –