limitations de colonne TSQL Computed
-
28-09-2019 - |
Question
CREATE TABLE [dbo].[MembershipModule](
[Id] [uniqueidentifier] ROWGUIDCOL NOT NULL,
[ParentId] [uniqueidentifier] NULL,
[TargetId] [int] NULL,
[WebContentId] [uniqueidentifier] NULL,
[Name] [varchar](35) NOT NULL,
[NameUpper] AS (isnull(upper([Name]),'')) PERSISTED NOT NULL,
[UriPrefix] [varchar](max) NULL,
[UriText] [varchar](max) NULL,
[UriComputed] AS ??? PERSISTED,
[Description] [varchar](100) NULL,
[Created] [date] NOT NULL,
[Modified] [datetime2](7) NOT NULL,
[MenuItem] [bit] NOT NULL,
[Enabled] [bit] NOT NULL,
[Position] [smallint] NULL,
CONSTRAINT [PK_MembershipModule] 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]
Jusqu'à présent, le champ UriComputed est calculé comme suit:
lower(replace(isnull([UriPrefix],'/')+coalesce([UriText],[Name]),' ','-'))
Ce produit la sortie suivante
Maintenant, je voudrais mettre fin à toutes les valeurs UriComputed avec '/'
. Ce serait facile à réaliser en ajoutant + '/'
au champ calculé, à l'exception du fait que « sans texte » uri, seraient résiliés comme //, que je ne veux pas le cas.
depuis le sql je peux mettre dans un champ calculé est assez limité (et je ne sais pas vraiment l'étendue de ces limites) Je pensais que je demande ici comment ajouter ceci.
au fond, je veux que la sortie dans l'image à être
/a/login/ /a/announcements/ /a/ /
mon plus proche tentative de faire cela a été:
isnull(convert(varchar(MAX),nullif(len(coalesce([UriText],[Name])),0)),'/')
Ce qui fait une sorte de gâchis, et ajoute un certain nombre si elle doit se terminer dans « / », et ajoute « / » quand il se doit, ce que j'avais besoin est le contraire (qui est, « / » lorsque la longueur est 0, '' autrement)
S'il y a une ligne ou quelque chose comme si je pouvais utiliser ce serait essentiellement, mais je ne sais pas à ce sujet.
Merci!
La solution
Cela a fonctionné pour moi:
[UriComputed] AS (CASE
WHEN RIGHT(lower(replace(isnull([UriPrefix],'/')+coalesce([UriText],[Name]),' ','-')), 1) = '/' THEN
lower(replace(isnull([UriPrefix],'/')+coalesce([UriText],[Name]),' ','-'))
ELSE
lower(replace(isnull([UriPrefix],'/')+coalesce([UriText],[Name]),' ','-')) +'/'
END) PERSISTED,
Full CREATE TABLE:
CREATE TABLE [dbo].[MembershipModule](
[Id] [uniqueidentifier] ROWGUIDCOL NOT NULL,
[ParentId] [uniqueidentifier] NULL,
[TargetId] [int] NULL,
[WebContentId] [uniqueidentifier] NULL,
[Name] [varchar](35) NOT NULL,
[NameUpper] AS (isnull(upper([Name]),'')) PERSISTED NOT NULL,
[UriPrefix] [varchar](max) NULL,
[UriText] [varchar](max) NULL,
[UriComputed] AS (CASE
WHEN RIGHT(lower(replace(isnull([UriPrefix],'/')+coalesce([UriText],[Name]),' ','-')), 1) = '/' THEN
lower(replace(isnull([UriPrefix],'/')+coalesce([UriText],[Name]),' ','-'))
ELSE
lower(replace(isnull([UriPrefix],'/')+coalesce([UriText],[Name]),' ','-')) +'/'
END) PERSISTED,
[Description] [varchar](100) NULL,
[Created] [date] NOT NULL,
[Modified] [datetime2](7) NOT NULL,
[MenuItem] [bit] NOT NULL,
[Enabled] [bit] NOT NULL,
[Position] [smallint] NULL)