亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

[SQL]不要讓SQLServer幫你自動(dòng)轉(zhuǎn)換SQL命令中的

系統(tǒng) 2643 0

為什么不要讓 SQLServer 幫你自動(dòng)轉(zhuǎn)換 SQL 命令中的數(shù)據(jù)類型

Report Date ?? 2003/12/5

Prepared by ????

Article last modified on 2004-2-16

The information in this article applies to:

ü ???????? Microsoft SQL Server 2000,7.0

問(wèn)題陳述 :

有一天,執(zhí)行

SELECT * FROM XXX_ORIGINAL_20031205
where msgid =62010388000012

語(yǔ)句,結(jié)果 SQL Server 報(bào)告出錯(cuò): 將數(shù)據(jù)類型 varchar 轉(zhuǎn)換為 numeric 時(shí)出錯(cuò)。

?

這是什么意思呢?

Msgid 這個(gè)字段的類型是: varchar(30)

?

環(huán)境:

數(shù)據(jù)庫(kù)服務(wù)器: Microsoft SQL Server 2000 以及 7.0

數(shù)據(jù)庫(kù)服務(wù)器補(bǔ)丁: Microsoft SQL Server 2000 ServicePack1

?

原因分析:

不是 SQL Server 突然不能從數(shù)字自動(dòng)轉(zhuǎn)換為字符串,而是單單對(duì)這個(gè)字段的數(shù)值有問(wèn)題,這也和這個(gè)字段中實(shí)際已存儲(chǔ)的字符串有關(guān)。

?

你看,我執(zhí)行這個(gè) SQL 語(yǔ)句是沒(méi)有問(wèn)題,可以自動(dòng)轉(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è)效率問(wèn)題,轉(zhuǎn)換這么多 msgid 成為數(shù)字,再跟你的數(shù)字匹配,將是一個(gè)多么大的浪費(fèi)啊 )

當(dāng)然,這回 SQLServer 轉(zhuǎn)不過(guò)來(lái)了,因?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

命令就會(huì)得到錯(cuò)誤:

varchar '12050003010101026986' 的轉(zhuǎn)換溢出了 int 列。超出了最大整數(shù)值。

?

這個(gè)錯(cuò)誤,是不是很清楚地表明了 SQLServer 在幫你執(zhí)行 SQL 命令時(shí)背后所作的事情?

他試圖幫你主動(dòng)把記錄中的這個(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è)類型,所以會(huì)增加執(zhí)行時(shí)間;第二,容易轉(zhuǎn)換出錯(cuò)。

所以,切忌讓 SQLServer 自己判斷,自動(dòng)幫你轉(zhuǎn)換,那樣將降低執(zhí)行效率,而且增加出錯(cuò)幾率。你能夠顯式告訴 SQL Server 你的數(shù)據(jù)類型的話,就請(qǐng)一定這么做。

?

?

Writen by zhengyun.NoJunk(at)tomosoft.dot.com

Disclaimers

本文檔所包含的信息代表了在發(fā)布之日, ZhengYun 對(duì)所討論問(wèn)題的當(dāng)前看法, Zhengyun 不保證所給信息在發(fā)布之日以后的準(zhǔn)確性。

本文檔僅供參考。對(duì)本文檔中的信息, Zhengyun 不做任何明示或默示的保證。

用戶必須遵守所有適用的版權(quán)法。在不對(duì)版權(quán)法所規(guī)定的權(quán)利加以限制的情況下,如未得到 zhengyun CSDN.Net 明確的書(shū)面許可,不得出于任何目的、以任何形式或手段(電子的、機(jī)械的、影印、錄制等等)復(fù)制、傳播本文的任何部分,也不得將其存儲(chǔ)或引入到檢索系統(tǒng)中。



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=12744


[SQL]不要讓SQLServer幫你自動(dòng)轉(zhuǎn)換SQL命令中的數(shù)據(jù)類型


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 欧美vs日韩vs国产在线观看 | 2021国产成人综合亚洲精品 | a高清免费毛片久久 | 国产一级久久免费特黄 | 亚洲有色| 国产成人免费在线观看 | 亚洲涩色 | 中文字幕在线看视频一区二区三区 | 国产主播在线播放 | 999精品视频在线观看 | 久久手机在线视频 | 国产欧美综合在线一区二区三区 | 国产精品久久天天影视 | 国产精品美女久久久久 | 日韩成人免费在线视频 | 色综合一区 | 免费观看成人羞羞视频网站观看 | 国产美女一级视频 | 国产123区 | 久久高清一区二区三区 | 欧美激情免费看 | 777福利 | 成人在线免费视频播放 | 精品乱码一区二区三区四区 | 91在线精品亚洲一区二区 | 2022国产91精品久久久久久 | 热er99久久6国产精品免费 | 综合激情五月婷婷 | 看一下毛片 | 天天干天天上 | 99热在线观看免费 | 四虎精品影院在线观看视频 | 福利国产 | 久久精品国产屋 | 国内精品久久久久久中文字幕 | 亚洲国产www| 99免费在线观看 | 午夜性色福利视频在线视频 | 黄色影院在线观看视频 | 日本一级爰免费视频 | 亚洲精品国产一区二区在线 |