【发布时间】:2013-10-30 15:05:14
【问题描述】:
一些背景知识:我在 sql server 2005 上(我知道 :( ...)
简而言之:我正在连接三个 varchar 列并将它们转换为 nvarchar 作为模式绑定索引视图中的列。所有三列都是 pkeys 而不是 null。但是当转换发生时,结果列被设置为允许空值,然后不能参与全文索引。 (如果连接未转换为 nvarchar,则该列被隐式创建为 not null。)那么,我如何将三个 varchars 转换并连接到 nvarchar ,以便生成的计算列不会允许空值吗?
详情:
我创建了一个模式绑定视图(索引视图),因此我可以应用全文索引并提高搜索性能。除了我在sql server 2005 遇到了这个错误之外,这个世界一切都很好
因此,正如文章建议的那样,我想我会将聚集索引(我的全文索引所基于的索引)从 varchar 转换为 NVARCHAR。
这是我将索引列转换为 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”,或者向索引视图添加一个标识列来实现它,这样我就可以避免文章中概述的错误?
【问题讨论】:
-
作为参考,我很确定发生这种情况的原因是因为 CONVERT 和 CAST 以非确定性的形式返回,即使文档声明它们是确定性的......
-
您是否尝试将问题列包装在
ISNULL(<column>,'')中? - 这通常会迫使它将该列视为NOT NULL。 -
@Damien_The_Unbeliever 感谢您的建议,我刚试了一下,似乎没有任何改变...
标签: sql sql-server sql-server-2005 full-text-indexing