2

一些背景:我在 sql server 2005 上(我知道 :( ...)

简要地说:我正在连接三varchar列并将它们转换nvarchar为模式绑定的索引视图中的一列。所有三列都是 pkeys 而不是 null。但是当转换发生时,结果列被设置为允许空值,然后不能参与全文索引。(如果连接未转换为 nvarchar,则该列隐式创建为not null。)那么,我如何转换 AND 连接三个varcharsto 以nvarchar 使生成的计算列不允许空值?

细节:

我创建了一个模式绑定视图(索引视图),因此我可以应用全文索引并提高搜索性能。世界上一切都很好,除了我在sql server 2005中遇到了这个错误

因此,正如文章建议的那样,我想我会将聚集索引(我的全文索引所基于的索引)转换为NVARCHARfrom varchar.

这是我将索引列转换为 nvarchar 之前的视图代码:

CREATE VIEW [dbo].[IndexedPart] WITH SCHEMABINDING
AS
SELECT     (I.ItemCode + ILP.CurrencyCode + IU.UOM) as Id, I.ItemCode, I.Image1, I.Image2,       I.Image3, REPLACE(I.ShortDescription, '&','&') AS ShortDescription, I.ModelNum, REPLACE(I.ItemBrand,'&','&') AS ItemBrand, ILP.ListPrice, ILP.CurrencyCode, IU.UOM, IU.DefaultUOM, 
                  IU.MinimumPrice, IU.MinimumOrderQty, IU.MaximumOrderQty, IU.OrderIncrement, I.LongDescription, IU.QtyAvail, irc.ReplenishmentClass, 
                  ISNULL(rc.SortLast, 1) AS SortLast, ISNULL( I.DoNotSell, 'N') as DoNotSell, 
ISNULL( I.EffectiveStatus, 'I') as EffectiveStatus, (REPLACE(I.ItemCode + ' ' +     I.ShortDescription + ' ' + I.ItemBrand + ' ' + I.ModelNum,'&','&')) AS FullTextIndex
FROM         dbo.Item AS I INNER JOIN
                  dbo.ItemUOM AS IU ON I.ItemCode = IU.ItemCode INNER JOIN
                  dbo.ItemListPrice AS ILP ON I.ItemCode = ILP.ItemCode AND IU.UOM =     ILP.UOM INNER JOIN
                      dbo.ItemReplenishmentClass AS irc ON irc.ItemCode = I.ItemCode INNER     JOIN
                      dbo.ReplenishmentClass AS rc ON irc.ReplenishmentClass =     rc.ReplenishmentClass;

CREATE UNIQUE CLUSTERED INDEX [IX_ItemCode_CurrencyCode_UOM_Clustered] ON [dbo].    [IndexedPart] 
(
[Id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = ON, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]

作为背景,我用于在此视图上创建 Id 的三列都是其他表的主键。

当我将一个从 VARCHAR 到 NVARCHAR 的转换添加到该索引视图上的 Id 列时,我可以运行相同的脚本来创建该索引,但突然 SQL Server 决定该索引将允许空值。这意味着我不能再在该视图上创建全文索引。

无论如何我可以让这个索引作为允许空值'NO'返回,或者向索引视图添加一个标识列来实现它,这样我就可以避免文章中概述的错误?

4

1 回答 1

0

我发现不幸的是,这在视图中是不可能的。解决方法?升级到 SQL 2008(我的偏好),创建一个通过 ssis/dts 填充的表,该表具有视图的所有列,但具有 nvarchar 数据类型。

没有很好的解决方案,但仍然是一个解决方案。

于 2013-11-07T15:33:41.870 回答