Envoyer un vide valeur de type DateTime dans la procédure stockée SQL. Mais pas null
J'ai une procédure stockée SQL qui accepte un DateTime paramètre qui a une valeur par défaut NULL
@pmNext_Check_Date DATETIME=NULL
Je veux utiliser ce paramètre dans les 3 scénarios:
- Si elle est NULL alors ne pas mettre à jour tous les enregistrements
- Si elle a une valeur de date, puis mettre à jour tous mes enregistrements spécifiés dans ma clause where
- Le problème! Définir tous les champs de date dans ma requête à NULL pour les enregistrements dans ma clause where.
Ici est le bloc de code au sein de la SP qui pose moi des questions (le reste de l'instruction de mise à JOUR est en construire ailleurs dans le SP et fonctionne très bien):
IF @pmNext_Check_Date IS NOT NULL
IF @pmNext_Check_Date ='' --This is the bit that is causing me a problem. I just need to check for a empty date
SET @sql = @sql + ' Next_Check_Date = NULL '
ELSE
SET @sql = @sql + ' Next_Check_Date = @pmNext_Check_Date '
SET @sql = @sql + ' WHERE ID IN (1, 2)'
Donc par exemple si j'ai les 2 rangs:
ID NextCheckDate
1 12/12/12
2 NULL
Dans le scénario 1, je ne le passez pas le paramètre de la procédure utilise la valeur par défaut et pas de dates seront mises à jour.
Dans le scénario 2, je passe à une valeur de date et jour à la fois les lignes avec la valeur de la date
Dans le scénario 3 je veux mettre à jour la valeur de la date sur mes lignes à null. La différence entre le scénario 1 & 3-dans le scénario 3, l'utilisateur aura le choix pour définir les valeurs de la date à null.
J'ai donc voulu passer à une date vide dans la procédure stockée. Je suis en train de faire cela à partir de C# et aimerais faire quelque chose comme ce qui suit:
SqlParameter param = new SqlParameter("@pmNext_Check_Date", "");
Cela échoue car le PS s'attend à un DateTime.
Donc, je veux être en mesure de passer à une date vide et aussi comment puis-je vérifier cela à l'intérieur de la SP. La présente vérification qui est ci-dessous ne fonctionne pas:
IF @pmNext_Check_Date =''
Merci à l'avance.
Espérons que tout cela fait sens.
Je suis à l'aide de C#4.0 et SQL 2008
- Je suppose que vous avez essayé de l'envoyer dans
DBNull.Value
, droit? - Oui, j'ai essayé. C'est juste le même que l'utilisation de la valeur par défaut
- vous pouvez essayer d'envoyer mindate ou maxdate et de la lecture que dans votre SP
- Je voudrais un vide date de valeur, comme " à qui j'ai pu vérifier dans mon SP. Donc un peu comme une chaîne Null est différent d'une chaîne vide. Je ne vais pas être d'insérer " dans la base de données. Je veux vérifier que la valeur puis insérer la valeur null.
- Je pourrais envoyer min/max des dates, mais j'essayais de le faire d'une façon plus soignée vraiment. Aussi le min/max la date pourrait être à l'extérieur de la configuration de SQL gamme
- Donc, vous voulez deux "non date" (valeurs null et vide). Pourquoi pensez-vous que c'est possible?
- Il est possible de faire sur une chaîne. Et je ne pense pas que c'est possible, j'ai demandé si quelqu'un savait si il était possible ou si il était intelligent et de travail autour de
- Sauf si vous travaillez avec une édition de SQL Server, je n'ai jamais entendu parler, il n'y a pas de coûts additionnels pour ajouter un autre paramètre (si vous êtes à aucune limite sur le nombre de paramètres ont permis, vous avez d'autres questions). Ajoutez simplement de l'autre, le bien nommé, le paramètre de la procédure.
Vous devez vous connecter pour publier un commentaire.
Il n'y a pas une telle chose comme une "date vide". Vous pouvez utiliser un bien connu sentinelle valeur (01 Jan pour certains arbitraire de l'ancienne année, par exemple), mais
null
serait préférable. Notez que pour passer un explicitenull
par l'intermédiaire d'un paramètre, vous devez:Si cela n'a pas assez de granularité, envisager d'ajouter un distinct boolean (
bit
) paramètre (ou similaire) qui clarifie ce que vous voulez de la procédure stockée à faire. Ou: plusieurs procs de faire ces choses différentes.Une sentinelle de la valeur pour SQL Server est le 1er janvier 1753 (SQL Server minimum
datetime
valeur) - ce qui peut être produit en TSQL sans traitement de chaîne commecast(-53690 as datetime)
.bit
et plusieurs procs suggestion.Vous ne pouvez pas passer une chaîne vide comme un type datetime. Donc, vous avez quelques options. Vous pouvez ajouter un paramètre supplémentaire pour indiquer si oui ou non une mise à jour devrait se produire. Je pense que comme les meilleures options pour le code de la lisibilité et la maintenabilité. L'autre option serait de passer en paramètre une chaîne de caractères et l'analyse. De cette façon, vous pouvez utiliser votre chaîne vide concept.
Sql Server string à la date de conversion
Désolé, il n'y a aucun moyen de le faire précisément ce que vous demandez. Un
DATETIME
valeur estNULL
ou une date valide, il n'y a pas de "vide", comme il est avec des chaînes.Une autre solution est de passer d'un jeton de la valeur (ce ne serait pas une date valide sinon) pour représenter votre soi-disant chaîne vide, par exemple, une commune que j'ai vu utilisé est
1900-01-01
. Ensuite, vous pouvez différencier dans votre procédure stockée entreNULL
et "vide".Mais je ne recommande pas de faire cela. Je suis d'accord avec les autres suggestions: ajouter un autre paramètre et ne la logique d'une manière plus significative dans la procédure stockée.
Si je me souviens correctement, les colonnes avec un DATETIME type de données qui permettent les valeurs NULL
par défaut la valeur 1900-01-01 au lieu d'une valeur VIDE.
Par exemple:
Les valeurs NULL peut être autorisé dans certaines colonnes qui pourrait recevoir une valeur plus tard en bas de la ligne basé sur une logique d'entreprise. J'ai vu des gens de garder ces ouvert les colonnes varchar pour permettre une entrée personnalisée d'un certain type, ou une chaîne vide, quelque chose qui datetime ne le permettra pas.
Si vous me demandez je vais essayer de ne pas déconner avec la base de données de la colonne type et de le laisser rester comme DATETIME. Pour l'extraction des données et la production de rapports nous pourrions essayer la méthode suivante, qui peut ne pas être la meilleure façon de le faire. Mais il fonctionne.