2011-09-02 52 views
4

我試圖用try-catch來捕捉SQL查詢中的錯誤(不是在存儲過程中)。SQL try-catch語句不處理錯誤(SQL Server 2008)

出於某種原因,這不是我的處理錯誤,我仍然得到:

消息213,級別16,狀態1,行29 列名或提供值的數目不匹配表定義。

請幫忙嗎?

begin try 
create table #temp_hierarchy 
    (temp_gl_number varchar(50) 
    ,temp_store_location varchar(255) 
    ,temp_store_key varchar(50) 
    ,temp_serving_dc varchar(50) 
    ,temp_exploris_db varchar(50) 
    ,temp_dc_account varchar(50) 
    ,temp_store_type varchar(50) 
    ,temp_dvp_ops varchar(50) 
    ,temp_rdo varchar(50) 
    ,temp_team varchar(50) 
    ,temp_dvp_sales varchar(50) 
    ,temp_rds varchar(50) 
    ,temp_closed varchar(50) 
    ,temp_open_date varchar(50) 
    ,temp_close_date varchar(50) 
    ,temp_store_manager varchar(250) 
    ,temp_sales_teammate varchar(250) 
    ,temp_machine_shop varchar(50) 
    ,temp_address varchar(250) 
    ,temp_city varchar(50) 
    ,temp_state varchar(50) 
    ,temp_zip varchar(50) 
    ,temp_phone varchar(50) 
    ,temp_fax varchar(50)) 

insert into #temp_hierarchy 
select * 
from OPENROWSET('Microsoft.ACE.OLEDB.12.0', 
    'Excel 12.0;Database=C:\SQL_DATA_REPORTING\8-31-11 Store Hierarchy.xlsx;HDR=YES', 
    'SELECT * FROM [Master List$]'); 

truncate table tbl_hierarchy 

insert into tbl_hierarchy 
select * 
from #temp_hierarchy 
where temp_gl_number is not null 
    and temp_gl_number <> 'GLID' 

select @@ROWCOUNT + ' Records sucessfully imported' 

end try 

begin catch 
select 'ERROR: ' & ERROR_NUMBER() + '. Unable to import records, existing data was not lost.' 
end catch; 
go 
+0

我的猜測是tbl_hierarchy和#temp_hierarchy具有不同的列定義。 – etliens

+1

您可以使用'select * INTO T from OPENROWSET ...'查看用於臨時表的正確表定義。 –

回答

12

你不能在一個try-catch捕獲編譯時錯誤。

BooksOnline

編譯和語句級重新編譯錯誤

有兩種類型的錯誤,將不被TRY處理... CATCH如果在相同的執行水平爲發生 錯誤TRY ... CATCH 結構:

  1. 編譯錯誤,如防止一批從語法錯誤執行。

  2. 錯誤中語句級重新編譯發生,如編譯之後發生的因延遲 名稱解析對象 名稱解析錯誤。

+1

這是有道理的。那麼我將如何能夠捕捉到這個錯誤呢? – ChandlerPelhams

+2

@ChandlerPelhams更進一步,在BOL文章中,它提到了使用動態SQL或在存儲過程中包裝查詢。 try-catch會抓住它。 – etliens

+0

非常感謝您的幫助。 – ChandlerPelhams

0

錯誤是由下面的語句

select @@ROWCOUNT + ' Records sucessfully imported' 

@@ ROWCOUNT是一個整數引起的,所以轉換爲字符串第一。

select convert(varchar(10),@@ROWCOUNT) + ' Records sucessfully imported' 

編輯:這是一個錯誤,但它似乎是這個錯誤的catch被抓住,所以你必須有導致此問題的另一個編譯時錯誤。

1

你不應該使用SELECT *插入 - - 永遠!這是不好的做法,它正在導致你發佈的錯誤。在查詢的select和INSERT部分中定義列。

+4

我的問題是關於爲什麼錯誤沒有被困住,而不是錯誤發生的事實。 – ChandlerPelhams