TSQL Ограничения вычисляемого столбца - PullRequest
2 голосов
/ 07 октября 2010
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]

Пока что поле UriComputed вычисляется так:

lower(replace(isnull([UriPrefix],'/')+coalesce([UriText],[Name]),' ','-'))

Это производит вывод, подобный следующему

Results

Теперь я бы хотел завершить все значения UriComputed с '/'. Этого легко достичь, добавив + '/' к вычисляемому полю, за исключением того факта, что «безтекстовый» uris будет завершен как //, чего я не хочу.

, поскольку sql, который я могу поместить в вычисляемое поле, весьма ограничен (и я действительно не знаю степень этих ограничений), я решил спросить здесь, как добавить это.

в основном я хочу, чтобы вывод на изображении был

/a/login/
/a/announcements/
/a/
/

Моя ближайшая попытка сделать это была:

isnull(convert(varchar(MAX),nullif(len(coalesce([UriText],[Name])),0)),'/')

Что делает вид беспорядка, и добавляет число, если оно должно оканчиваться на «/», и добавляет «/», когда это необходимо, мне нужно наоборот (то есть, «/», когда длина равно 0, '' в противном случае)

Если есть встроенный вариант, или что-то подобное, я мог бы использовать его, но в основном я не знаю об этом.

Спасибо!

1 Ответ

5 голосов
/ 07 октября 2010

Это сработало для меня:

[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,

Полный оператор 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)
...