88 votes

Comment créer une colonne de vue NON NULL

Je suis en train de créer une vue où je veux une colonne de n'être que vrai ou faux. Cependant, il semble que peu importe ce que je fais, SQL Server (2008) estime que ma colonne de bits peut en quelque sorte être null.

J'ai une table appelée "Produit" à la colonne "Statut" qui est - INT, NULL. En vue, je veux retourner une ligne pour chaque ligne de Produits, avec un PEU de colonne est définie sur true si le Produit.Le statut de la colonne est égal à 3, sinon le champ de bits doit être fausse.

Exemple SQL

SELECT CAST( CASE ISNULL(Status, 0)  
               WHEN 3 THEN 1  
               ELSE 0  
             END AS bit) AS HasStatus  
FROM dbo.Product  

Si je enregistrez cette requête sous un point de vue et de regarder les colonnes de l'Explorateur d'Objets, la colonne HasStatus est définie à l' BIT, NULL. Mais il ne doit jamais être NULL. Est-il de la magie SQL truc que je peux utiliser pour la force de cette colonne pour être NOT NULL.

Notez que, si je supprime l' CAST() autour de la CASE, la colonne est réglée correctement en NOT NULL, mais alors le type de la colonne est définie à l' INT, ce qui n'est pas ce que je veux. Je veux qu'il soit BIT. :-)

155voto

RedFilter Points 84190

Vous pouvez réaliser ce que vous voulez ré-organiser votre requête un peu. Le truc, c'est que l' ISNULL doit être à l'extérieur avant de SQL Server va comprendre que la valeur ne peut jamais être NULL.

SELECT ISNULL(CAST(
    CASE Status
        WHEN 3 THEN 1  
        ELSE 0  
    END AS bit), 0) AS HasStatus  
FROM dbo.Product  

L'une des raisons je trouve ceci est utile lors de l'utilisation d'un ORM et vous ne voulez pas la valeur qui en résulte est mappé à un type nullable. Il peut rendre les choses plus facile tout autour si votre application voit la valeur comme jamais peut être null. Ensuite, vous n'avez pas à écrire du code pour gérer la valeur null exceptions, etc.

0voto

40-Love Points 1333

C’est le code que j’utilise, la colonne ID sera not NULL et toutes les autres NULL. Vous devez convertir la colonne bit ou varchar et comparer la colonne int à NULL.

 CREATE TABLE [dbo].[aTestTable](
    [ID] [int] NOT NULL,
    [varcharCol] [varchar](50) NOT NULL,
    [nullvarcharCol] [varchar](50) NULL,
    [bitCol] [bit] NOT NULL,
    [nullbitCol] [bit] NULL,
    [intCol] [int] NOT NULL,
    [nullintCol] [int] NULL,
 CONSTRAINT [PK_aTestTable] PRIMARY KEY CLUSTERED 
(
    [ID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]


CREATE VIEW [dbo].[aTestView]
AS
SELECT  ID ,
        NULLIF(varcharCol , '') AS varcharCol ,
        NULLIF(CAST(varcharCol AS VARCHAR), null) AS varcharCol1, --better
        nullvarcharCol ,
        NULLIF(CAST(bitCol AS INT), null) AS bitCol ,
        nullbitCol ,
        NULLIF(CAST(intCol AS INT), NULL) AS intCol ,
        nullintCol
FROM    dbo.aTestTable


Sample Data:

ID  varcharCol  nullvarcharCol  bitCol  nullbitCol  intCol  nullintCol
1   1   1   1   1   1   1
2   0   0   0   0   0   0
3   0   NULL    0   NULL    0   NULL
4   a   a   1   1   2   2
 

hth

-1voto

Mevdiven Points 941
DROP TABLE [dbo].[myTable1]
GO

CREATE TABLE [dbo].[myTable1](
    [a] [int] NULL,
    [b] [varchar](50),
) ON [PRIMARY]
GO

INSERT INTO [dbo].[myTable1]([a],[b]) VALUES(1,'A');
INSERT INTO [dbo].[myTable1]([a],[b]) VALUES(2,'B');
INSERT INTO [dbo].[myTable1]([a],[b]) VALUES(3,'C');
INSERT INTO [dbo].[myTable1]([a],[b]) VALUES(4,'D');
INSERT INTO [dbo].[myTable1]([a],[b]) VALUES(5,NULL);


SELECT *, 
    (CASE b
        WHEN NULL THEN CAST(0 AS BIT)
        WHEN 'A' THEN CAST(1 AS BIT)
        WHEN 'B' THEN CAST(0 AS BIT)
        ELSE CAST(0 AS BIT)
    END) AS Status
FROM dbo.myTable1

-3voto

Charles Bretana Points 59899

Tout ce que vous pouvez faire dans une instruction Select est de contrôler les données que le moteur de base de données envoie pour vous en tant que client. L'instruction select n'a pas d'effet sur la structure de la table sous-jacente. Pour modifier la structure de la table, vous devez exécuter une instruction Alter Table.

  1. Assurez-vous d'abord qu'il n'existe actuellement pas de valeurs null dans ce champ de bits dans la table
  2. Ensuite, exécutez l'instruction ddl suivante: Alter Table dbo.Product Alter column status bit not null

Si, otoh, que, tout ce que vous essayez de faire est de contrôler la sortie de la vue, puis ce que vous faites est suffisant. Votre syntaxe permettra de garantir que la sortie de la HasStatus colonne dans la vue resultset ne sera en fait jamais être null. Il va toujours être soit la valeur du bit = 1 ou valeur de bit = 0. Ne vous inquiétez pas à ce que l'explorateur d'objets dit...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X