2010-10-01 4 views
1

J'ai une procédure stockée dans SQL Server 2008 qui va insérer un enregistrement dans une table.Vérification de la date non valide dans SQL Server stocké Procédure

Le sproc ressemble à ceci:

-- params 
@f1 int, 
@f2 datetime = null, 
@f3 datetime, 
@f4 bit = 0 

BEGIN 
    INSERT INTO dbo.table 
    (fields......) 
    VALUES 
    (@params.....) 

    RETURN @@IDENTITY 
END 

Avant d'exécuter l'instruction INSERT, je voudrais piéger la valeur datetime de la f2 param. Si f2 n'est pas une date valide, je voudrais la mettre à null.

Je suis flou sur la syntaxe sur la façon de faire cela. Je pensais que ce qui suit suffirait, mais pas si:

--params 
@f1.. 
@f2.. 
... 

IF(ISDATE(@f2) < 1) 
SET @f2= NULL 

BEGIN 
INSERT... 
... 
END 

Quelle est la syntaxe pour le piégeage et la réinitialisation d'une valeur de param avant d'exécuter une instruction INSERT? A propos, la raison qui m'a conduit à trouver une solution à ce problème est que je passe une valeur de date minimale C# de "1/1/0001" à SQLS qui supporte la valeur de date minimale de "1/1/1753".

Répondre

3

Depuis @ f2 est un datetime il ne sera jamais tenir une date non valide

mais juste pour le plaisir, voici comment vous le vérifier

IF ISDATE(@f2) =0 
SET @f2= NULL 

Mais comme je l'ai dit cela ne peut jamais être vrai, si vous passez Jan 1600 à 1 le proc, il va exploser et ne jamais exécuter

si vous êtes sur SQL Server 2008, vous pouvez utiliser datetime2

Voici un exemple, si vous ne pouvez pas chan ge la colonne datetime, vous pouvez toujours utiliser datetime2 pour vérifier

declare @d datetime2 
select @d = '16000101' 

select @d, 
    convert(varchar(8),@d,112), 
    isdate(convert(varchar(8),@d,112)) -- not a valid datetime 
+0

1 - Je sens overthought ce. Je pensais: «Si le paramètre est un datetime, comment une date invalide va-t-elle aussi loin? – LittleBobbyTables

3

Il est déjà un datetime valide parce qu'il a été transmis via le paramètre proc stocké. Il ne sera pas une date avant 1753

Remarque: dans SQL Server 2008, vous avez la date et datetime2 qui remontent à l'année 0, mais ISDATE ne fonctionne que pour gammes datetime « vieux » dit MSDN

Questions connexes