一些背景:我在 sql server 2005 上(我知道 :( ...)
简要地说:我正在连接三varchar
列并将它们转换nvarchar
为模式绑定的索引视图中的一列。所有三列都是 pkeys 而不是 null。但是当转换发生时,结果列被设置为允许空值,然后不能参与全文索引。(如果连接未转换为 nvarchar,则该列隐式创建为not null
。)那么,我如何转换 AND 连接三个varchars
to 以nvarchar
使生成的计算列不允许空值?
细节:
我创建了一个模式绑定视图(索引视图),因此我可以应用全文索引并提高搜索性能。世界上一切都很好,除了我在sql server 2005中遇到了这个错误
因此,正如文章建议的那样,我想我会将聚集索引(我的全文索引所基于的索引)转换为NVARCHAR
from 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'返回,或者向索引视图添加一个标识列来实现它,这样我就可以避免文章中概述的错误?