2017-07-06 151 views
2

我正面臨SQL Server的問題。將varchar值「0%」轉換爲數據類型int時發生轉換失敗int

我創建了一個表是這樣的:

create table Components 
(
    pk BIGINT NOT NULL PRIMARY KEY IDENTITY, 
    id VARCHAR(50), 
    descr VARCHAR(50), 
    in_m INT, 
    in_iy INT, 
    p_fw VARCHAR(5000) 
); 

,我試圖插入幾個值:

insert into Components (id, descr, in_m, in_iy, p_fw) 
values ('FW000_A', '0%', 0, 0, '[0.0,0.0,0.0]'), 
     ('FW000_B', '1%', 1, 1, '[1.0,1.0,1.0]'); 

我得到以下錯誤:

Msg 245, Level 16, State 1, Line 111
Conversion failed when converting the varchar value '0%' to data type int.

即使列descr正確定義爲varchar(50)

有人可以幫我嗎?爲什麼SQL Server試圖將我的字符串轉換爲int值?

+1

您的代碼適用於SQL Server 2014中的我。http://rextester.com/UOOT87695您確定它是剛剛創建的同一張表嗎?相同的模式等? –

+0

我正在使用SQL Server Express 2012,但是,我有「使用mydb;」聲明在文件的開頭。編輯:我試圖爲創建和插入查詢添加表示法[schema]。[表],但我得到的結果與以前一樣... – jjhorn

+0

如果您運行SQL跟蹤(或使用https:// hibernatingrhinos.com/products/nhprof)通過線路傳遞的實際SQL是什麼? – mjwills

回答

2

什麼是從你的問題缺少的就是你的不僅僅是你出的兩個values線多了,其他的人的一個具有整字面值爲descr列,而不是字符串。

該示例產生同樣的錯誤:

declare @t table (Descr varchar(50) not null) 
insert into @t(Descr) values 
('0%'), 
(12) 

我相信情況是,SQL Server第一次嘗試,以確定數據類型爲values子句中的所有列。使用數據類型優先規則時,它觀察一行中的varchar文字和另一行中的int文字,因此確定此列的總體類型爲int,並嘗試執行導致該錯誤的轉換。

在此過程中,它確實使用而不是使用有關要放置values的目標表的任何信息,包括其中列的數據類型。

+0

你是絕對正確的! !!在第二列中有一個沒有引號的值'100',大約是第436個插入的元組,可能是我的sql自動代碼生成器中的一個錯誤,但更重要的是,我學習了這個重要概念'在這個過程中,它不會使用任何有關將要放置值的目標表的信息,包括列的數據類型。「感謝大家的支持,問題解決了! – jjhorn

1

運行此操作並驗證數據類型;

sp_columns Components 

貌似「DESCR」確實是一個整數

+0

令人驚訝的'descr'是一個varchar(50)... – jjhorn

相關問題