web-dev-qa-db-ja.com

ストアドプロシージャSQL ServerのパラメーターとしてNULLを制限する方法

としてストアドプロシージャを作成することは可能ですか

CREATE PROCEDURE Dummy 
    @ID INT NOT NULL
AS
BEGIN
END

なぜこのようなことができないのですか?

38

SprocとRAISERRORでNULLかどうかを確認して、呼び出し元の場所に状態を報告できます。

CREATE   proc dbo.CheckForNull @i int 
as
begin
  if @i is null 
    raiserror('The value for @i should not be null', 15, 1) -- with log 

end
GO

次に電話してください:

exec dbo.CheckForNull @i = 1 

または

exec dbo.CheckForNull @i = null 
49
Unsliced

あなたのコードは正しく、賢明で、さらに良い習慣です。この種類の構文をサポートするSQL Server 2014を待つだけです。

結局のところ、コンパイル時にできるのに実行時にキャッチするのはなぜですか?

このMicrosoftドキュメント も参照し、そこでNatively Compiledを検索してください。

Dkrezが言うように、null可能性はデータ型定義の一部とは見なされません。なぜだと思いますか。

13

このような構文が必要になる理由の1つは、C#データセットGUIウィザードでspを使用するときに、null制限がない場合、null許容パラメーターを持つ関数を作成するためです。 sp bodyのnullチェックはそれを助けません。

0
Kakha Middle Or

「この編集は投稿の本来の目的から逸脱しています。大幅な変更が必要な編集でも、投稿の所有者の目標を維持するよう努めるべきです。」という理由で、私は@Unsliced投稿を編集できないようです。

だから(@crokusekとみんなが興味を持っている)これは私の目的の解決策です:

SprocとRAISERRORでNULLかどうかを確認して、呼び出し元の場所に状態を報告できます。

CREATE proc dbo.CheckForNull 
  @name sysname = 'parameter',
  @value sql_variant
as
begin
  if @value is null
    raiserror('The value for %s should not be null', 16, 1, @name) -- with log
end
GO

次に電話してください:

exec dbo.CheckForNull @name 'whateverParamName', @value = 1

または

exec dbo.CheckForNull @value = null 
0
BigBother