web-dev-qa-db-fra.com

Insérer une chaîne vide dans la colonne INT pour SQL Server

Une table SAMPLE a une seule colonne ID de type int, default null.

Dans Oracle quand je fais:

  insert into SAMPLE (ID) values ('');

le nouvel enregistrement est ajouté avec une valeur vide. Mais dans SQL Server 2008, lorsque j'exécute la même instruction insert, le nouvel enregistrement a la valeur 0. 

Existe-t-il un moyen de forcer SQL Server 2008 à définir par défaut une chaîne vide sur NULL au lieu de 0 (pour le type de colonne numérique)?

12
user1793297

Utilisez NULL à la place.

insert into SAMPLE (ID) values (NULL);
6
Mikael Eriksson

En supposant que votre instruction INSERT fasse partie d’une procédure stockée réutilisée à de nombreux endroits de votre application (ou, éventuellement, d’un lot toujours construit par la même partie du code client) et que la valeur insérée est un nombre transmis en tant que argument de chaîne, vous pouvez modifier l'INSERT comme ceci:

INSERT INTO SAMPLE (ID) VALUES (NULLIF(@argument, ''));
5
Andriy M

Que diriez-vous d'une autre idée - définir un Déclencher INSTEAD OF INSERT .

Malgré le fait que vous essayez d'insérer une chaîne, l'opération est "interceptée", la chaîne vide est remplacée par NULL et l'insertion réussit.

Si vous définissez ce déclencheur sur votre table, vous pouvez continuer à insérer la chaîne vide comme auparavant, sans autre modification.

Edit: Comme le souligne Martin Smith, il s’agit en réalité d’une comparaison à 0 (l’équivalent d’une chaîne vide sous la forme d’un entier), ce qui signifie que vous ne pourrez pas enregistrer 0 dans ce tableau. Je laisse cette réponse ici au cas où cela conviendrait à votre situation - soit cela, soit refaire toutes vos questions!

CREATE TRIGGER EmptyStringTrigger
ON [SAMPLE]
INSTEAD OF INSERT
AS
  BEGIN
      INSERT INTO [SAMPLE](ID)
      SELECT CASE
               WHEN ID = '' THEN NULL
               ELSE ID
             END
      FROM   inserted
  END

Exemple SQL Fiddle

3
Bridge

Vous ne pouvez pas insérer une "chaîne" dans une colonne int. Oracle doit simplement gérer cela pour vous.

Essayez simplement d'insérer NULL si c'est ce dont vous avez besoin.

insert into SAMPLE (ID) values (NULL);
0
Jarod Elliott

Une autre option

insert into SAMPLE (ID) values (DEFAULT)
0