web-dev-qa-db-fra.com

Comment limiter NULL en tant que paramètre à la procédure stockée SQL Server?

Est-il possible de créer une procédure stockée en tant que

CREATE PROCEDURE Dummy 
    @ID INT NOT NULL
AS
BEGIN
END

Pourquoi n'est-il pas possible de faire quelque chose comme ça?

33
SharePoint Newbie

Vous pouvez vérifier sa valeur NULL dans le sproc et RAISERROR pour signaler l'état à l'emplacement de l'appelant. 

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

Puis appelez: 

exec dbo.CheckForNull @i = 1 

ou 

exec dbo.CheckForNull @i = null 
42
Unsliced

Votre code est correct, raisonnable et même une bonne pratique. Vous devez simplement attendre SQL Server 2014, qui prend en charge ce type de syntaxe. 

Après tout, pourquoi attraper au moment de l'exécution quand vous pouvez au moment de la compilation?

Voir aussi ce document msdn et recherchez Natively Compiled dedans.

Comme l'indique dkrez, la nullité n'est pas considérée comme faisant partie de la définition du type de données. Je me demande encore pourquoi pas.

13
Patrick Fromberg

Oh, eh bien, il semble que je ne puisse pas éditer le post de @Unsliced ​​car "Ce montage diffère de l'intention initiale du message. Même les modifications qui doivent apporter des modifications drastiques doivent s'efforcer de préserver les objectifs du propriétaire du message".

Donc (@ crokusek et tous les intéressés), voici ma solution proposée:

Vous pouvez vérifier sa valeur NULL dans le sproc et RAISERROR pour signaler l'état à l'emplacement de l'appelant. 

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

Puis appelez: 

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

ou 

exec dbo.CheckForNull @value = null 
0
BigBother