2012-10-26 34 views
2

我有一個列部分#可以包含許多非字母數字字符。我經常需要將來自客戶或供應商的零件號碼與我們的數據進行比較。我一直在用一個只返回字母數字的用戶定義函數成功地完成了這個任務。我通過在索引視圖上創建一個名爲stripPartNum的計算列來改進性能。我想將這個計算列移動到表中。計算列或索引視圖?

我無法創建計算列作爲持續,所以我可以在列上創建索引。
錯誤: 表'inventory'中的計算列'stripPartNum'無法保留,因爲該列是非確定性的。

我創建了一個不使用patIndex的新用戶定義函數,但仍然存在相同的問題。 下面是函數:

Create FUNCTION [dbo].[anOnly] 
(
@string VARCHAR(900) 
) 
RETURNS VARCHAR(900) 

AS 
BEGIN 

Declare @pos int,@newString varchar(1000),@charAt char(1) 
Set @pos = 0 
Set @newString = '' 

while @pos <= len(@string) 
    begin 
    Set @charAt = substring(@string,@pos,1) 
    if @charAt not like '[^0-9A-Za-z]' 
     Set @newString = @newString + @charAt 
    Set @pos = @pos + 1 
    end 

return @newString 
END 

我爲什麼能在視圖中的計算列創建索引,但不上臺面?有沒有我忽略的解決方案?

+0

也許更好的問題是爲什麼這個用戶定義的函數是不確定的? – user1777129

回答

0

啊,我剛剛找到答案。我的功能必須是模式綁定。