很久沒來了,提問+散分.
今天遇到個問題,與聚集索引有關,不知道大家有沒有遇到過這樣的情況,請大家不吝賜教.
表中有一nvarchar列,含有數字和字元.需要將該列中的全數字行轉換為數值後進行篩選.
轉換的方法是先使用isnumeric()= 1來判斷每行是否為數值,然後再使用cast()轉換.
當表中沒有聚集索引的時候可以正常轉換,而一旦加了聚集索引,則轉換會出錯,錯誤資訊為:
伺服器: 訊息 8114,級別 16,狀態 5,行 2
將資料型別 nvarchar 轉換為 float 時出錯。
以下是測試**,系統環境為:
簡體中文sqlserver2000sp4 + 簡體中文windowsserver2003sp1
sql code
ifobject_id(n'
tbtest')
isnot
null
drop
table
tbtest
go--
--建立測試表
create
table
tbtest(id
int,姓名
nvarchar(20
),部門**
nvarchar(10
))insert
into
tbtest
select1,n
'張三',n
'1000
'union
allselect2,n
'李四',n
'1001
'union
allselect3,n
'王五',n
'2001
'union
allselect4,n
'趙六',n
'2002
'union
allselect5,n
'趙七',n
'a3001'/*
該行含有字元,並非全數字
*/go
----查詢(該查詢能正常執行)
select
*from
tbtest
where
isnumeric
(部門**) =1
andcast
(部門**
asfloat
) >
1000
/*結果
id 姓名 部門**
----------- -------------------- ----------
2 李四 1001
3 王五 2001
4 趙六 2002
*/go
----!加入聚合索引
ifindexproperty
(object_id(n'
tbtest
'),n
'ix_tbtest',
'indexid')
isnot
null
drop
index
tbtest.ix_tbtest
gocreate
clustered
index
ix_tbtest
ondbo.tbtest(id)
go--
--查詢(相同的查詢**,卻因建立了聚合索引而丟擲8114異常)
select
*from
tbtest
where
isnumeric
(部門**) =1
andcast
(部門**
asfloat
) >
1000
/*結果
id 姓名 部門**
----------- -------------------- ----------
2 李四 1001
3 王五 2001
4 趙六 2002
伺服器: 訊息 8114,級別 16,狀態 5,行 2
將資料型別 nvarchar 轉換為 float 時出錯。
*/
聚集索引 非聚集索引
通常情況下,建立索引是加快查詢速度的有效手段。但索引不是萬能的,靠索引並不能實現對所有資料的快速訪問。事實上,如果索引策略和資料檢索需求嚴重不符的話,建立索引反而會降低查詢效能。因此在實際使用當中,應該充分考慮到索引的開銷,包括磁碟空間的開銷及處理開銷 如資源競爭和加鎖 例如,如果資料頻繁的更新或刪...
聚集索引和非聚集索引
聚集索引和非聚集索引 一 聚集索引和非聚集索引 聚集索引和非聚集索引的根本區別是表記錄的排列順序和與索引的排列順序是否一致,聚集索引表記錄的排列順序與索引的排列順序一致,優點是查詢速度快,因為一旦具有第乙個索引值的紀錄被找到,具有連續索引值的記錄也一定物理的緊跟其後。聚集索引的缺點是對錶進行修改速度...
聚集索引和非聚集索引
本文引自 一種索引,該索引中鍵值的邏輯順序決定了表中相應行的物理順序。聚集索引確定表中資料的物理順序。聚集索引類似於 簿,後者按姓氏排列資料。由於聚集索引規定資料在表中的物理儲存順序,因此乙個表只能包含乙個聚集索引。但該索引可以包含多個列 組合索引 就像 簿按姓氏和名字進行組織一樣。聚集索引對於那些...