Question

SQL Server Débutant question:

Je suis en train d'introduire une colonne calculée dans SQL Server (2008). Dans le concepteur de la table de SQL Server Management Studio, je peux le faire, mais le concepteur me propose une seule cellule d'édition unique pour définir l'expression de cette colonne. Depuis ma colonne calculée sera assez compliqué (en fonction de plusieurs champs de base de données et avec quelques différenciations de cas) Je voudrais avoir une manière plus confortable et maintenable pour entrer dans la définition de la colonne (ligne y compris les pauses pour la mise en forme et ainsi de suite).

Je l'ai vu il y a une option pour définir des fonctions dans SQL Server (fonctions de valeur scalaire ou valeur de table). Est-il peut-être préférable de définir une telle fonction et utiliser cette fonction que la spécification de la colonne? Et quel genre de fonction (valeur scalaire, la valeur de la table)?

Pour un exemple simplifié:

J'ai deux colonnes de base de données:

DateTime1 (smalldatetime, NULL)
DateTime2 (smalldatetime, NULL)

Maintenant, je veux définir une colonne calculée « Etat » qui peut avoir quatre valeurs possibles. Dans le langage factice:

if (DateTime1 IS NULL and DateTime2 IS NULL)
    set Status = 0
else if (DateTime1 IS NULL and DateTime2 IS NOT NULL)
    set Status = 1
else if (DateTime1 IS NOT NULL and DateTime2 IS NULL)
    set Status = 2
else
    set Status = 3

Idéalement, je voudrais avoir une GetStatus() fonction qui peut accéder aux différentes valeurs de la colonne de la ligne du tableau que je veux calculer la valeur de « Status » pour, puis définir uniquement la spécification de colonne calculée comme GetStatus() sans paramètres.

Est-ce possible? Ou quelle est la meilleure façon de travailler avec des « complexes » les définitions des colonnes calculées?

Nous vous remercions de conseils à l'avance!

Était-ce utile?

La solution

Vous pouvez le faire dans une instruction alter table:

alter table my_table_name
  add Status as 
    case 
      when (DateTime1 IS NULL and DateTime2 IS NULL) then 0
      when (DateTime1 IS NULL and DateTime2 IS NOT NULL) then 1
      when (DateTime1 IS NOT NULL and DateTime2 IS NULL) then 2
      else 3
    end

Sous la direction de fixer stupide de copier-coller erreur de syntaxe

Autres conseils

Vous pouvez toujours utiliser également une fonction définie par l'utilisateur pour cela - envelopper votre code « compliqué » dans un UDF, et l'utiliser pour définir votre colonne calculée:

CREATE FUNCTION dbo.GetStatus(@DateTime1 DATETIME, @DateTime2 DATETIME)
RETURNS INT
AS BEGIN
    DECLARE @Result INT

    IF (@DateTime1 IS NULL AND @DateTime2 IS NULL)
       SET @Result = 0
    ELSE IF (@DateTime1 IS NULL AND @DateTime2 IS NOT NULL)
       SET @Result = 1
    ELSE IF (@DateTime1 IS NOT NULL AND @DateTime2 IS NULL)
       SET @Result = 2
    ELSE
       SET @Result = 3

    RETURN @Result
END

et puis vous définissez votre colonne calculée comme suit:

ALTER TABLE dbo.YourTable
    ADD Status AS dbo.GetStatus(DateTime1, DateTime2)

Vous pouvez utiliser un déclencheur pour assurer une valeur de colonne sur insertion ou mise à jour.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top