2
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]),' ','-'))

これにより、次のような出力が生成されます

結果

ここで、すべての UriComputed 値を で終了したいと思います'/'。これは、「テキストのない」URI が // のように終了するという事実を除いて、計算フィールドに追加することで簡単に実現できますが+ '/'、これは発生したくありません。

計算フィールドに入れることができる sql は非常に限られているため (そして、これらの制限の範囲を実際には知りません)、これを追加する方法をここで尋ねたいと思いました。

基本的に、画像の出力を

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

これを行うための私の最も近い試みは次のとおりです。

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

これは一種の混乱を招き、「/」で終了する必要がある場合は数字を追加し、必要な場合は「/」を追加します。必要なのは反対です(つまり、長さが0の場合は「/」、 '' それ以外は)

インライン if またはそのようなものがあれば、基本的にそれを使用できますが、それについてはわかりません。

ありがとうございました!

4

1 に答える 1

5

これは私のために働いた:

[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)
于 2010-10-07T03:28:57.893 に答える