2011-09-02 109 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