為什么不要讓 SQLServer 幫你自動轉(zhuǎn)換 SQL 命令中的數(shù)據(jù)類型
Report Date
:
??
|
Prepared by
:
????
鄭
昀
|
Article last modified on
|
|
The information in this article applies to:
ü
????????
Microsoft SQL Server 2000,7.0
|
問題陳述
:
有一天,執(zhí)行
SELECT * FROM XXX_ORIGINAL_20031205
where
msgid
=62010388000012
語句,結(jié)果
SQL Server
報(bào)告出錯(cuò):
“
將數(shù)據(jù)類型
varchar
轉(zhuǎn)換為
numeric
時(shí)出錯(cuò)。
”
這是什么意思呢?
Msgid
這個(gè)字段的類型是:
varchar(30)
。
環(huán)境:
數(shù)據(jù)庫服務(wù)器:
Microsoft SQL Server 2000
以及
7.0
;
數(shù)據(jù)庫服務(wù)器補(bǔ)丁:
Microsoft SQL Server 2000 ServicePack1
;
?
原因分析:
不是
SQL Server
突然不能從數(shù)字自動轉(zhuǎn)換為字符串,而是單單對這個(gè)字段的數(shù)值有問題,這也和這個(gè)字段中實(shí)際已存儲的字符串有關(guān)。
?
你看,我執(zhí)行這個(gè)
SQL
語句是沒有問題,可以自動轉(zhuǎn)換:
SELECT * FROM XXXX_ORIGINAL_20031205
where
recordid
=62010388000012
recordid
這個(gè)字段的類型也是:
varchar(30)
。
這為什么就可以呢?
為什么?
這是因?yàn)?
msgid
字段的真實(shí)數(shù)值是類似于這樣的字符串
“12051113280101053509”
,由于你的
SQL
命令中要求拿字符串跟我們提供的這個(gè)數(shù)字
62010388000012
匹配,所以
SQLServer
默認(rèn)要把這么多個(gè)
“12051113280101053509”
先統(tǒng)統(tǒng)轉(zhuǎn)換為數(shù)字,再去跟
62010388000012
匹配。
(
首先這就涉及到一個(gè)效率問題,轉(zhuǎn)換這么多
msgid
成為數(shù)字,再跟你的數(shù)字匹配,將是一個(gè)多么大的浪費(fèi)啊
)
當(dāng)然,這回
SQLServer
轉(zhuǎn)不過來了,因?yàn)?
“12051113280101053509”
換為數(shù)字實(shí)在太大了,超出了范圍,所以你看
SQLServer
于是乎報(bào)告
“
將數(shù)據(jù)類型
varchar
轉(zhuǎn)換為
numeric
時(shí)出錯(cuò)
”
,他指的就是把歷史數(shù)據(jù)
“12051113280101053509”
這個(gè)
varchar(30)
轉(zhuǎn)成
numeric
不行,而不是把你
SQL
腳本傳遞的參數(shù)
62010388000012
轉(zhuǎn)換失敗。
讓我們看看另一種形式的錯(cuò)誤,就更清楚了:
我們執(zhí)行
SELECT * FROM XXXX_ORIGINAL_20031205
where msgid=120
命令就會得到錯(cuò)誤:
varchar
值
'12050003010101026986'
的轉(zhuǎn)換溢出了
int
列。超出了最大整數(shù)值。
?
這個(gè)錯(cuò)誤,是不是很清楚地表明了
SQLServer
在幫你執(zhí)行
SQL
命令時(shí)背后所作的事情?
他試圖幫你主動把記錄中的這個(gè)字段轉(zhuǎn)換成你在
SQL
命令中指明的那個(gè)數(shù)據(jù)類型。
我的建議:
很多時(shí)候,我們懶得去看某個(gè)字段到底是什么類型,是
char
,還是
tinyint
,還是
bool
,還是
varchar
,我們就隨便寫一個(gè)數(shù)字,讓聰明的
SQL Server
自己去判斷該轉(zhuǎn)成什么。
但是,第一,
SQL Server
不是轉(zhuǎn)換你的腳本命令中的數(shù)值,而是轉(zhuǎn)換已有的歷史數(shù)據(jù)到你指定的那個(gè)類型,所以會增加執(zhí)行時(shí)間;第二,容易轉(zhuǎn)換出錯(cuò)。
所以,切忌讓
SQLServer
自己判斷,自動幫你轉(zhuǎn)換,那樣將降低執(zhí)行效率,而且增加出錯(cuò)幾率。你能夠顯式告訴
SQL Server
你的數(shù)據(jù)類型的話,就請一定這么做。
Writen by zhengyun.NoJunk(at)tomosoft.dot.com
Disclaimers
:
本文檔所包含的信息代表了在發(fā)布之日,
ZhengYun
對所討論問題的當(dāng)前看法,
Zhengyun
不保證所給信息在發(fā)布之日以后的準(zhǔn)確性。
本文檔僅供參考。對本文檔中的信息,
Zhengyun
不做任何明示或默示的保證。
用戶必須遵守所有適用的版權(quán)法。在不對版權(quán)法所規(guī)定的權(quán)利加以限制的情況下,如未得到
zhengyun
和
CSDN.Net
明確的書面許可,不得出于任何目的、以任何形式或手段(電子的、機(jī)械的、影印、錄制等等)復(fù)制、傳播本文的任何部分,也不得將其存儲或引入到檢索系統(tǒng)中。
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=12744
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
