时间:2010-07-23 21:14:04

标签: .net sql

2 个答案:

答案 0 :(得分:2)

假设您使用的是SQL Server 2005或更高版本,则可以对脚本中的每个语句使用不同的TRY / CATCH块。这是一个例子:

DECLARE @errorLog TABLE (
  row_id INT NOT NULL IDENTITY(1,1), 
  error_msg NVARCHAR(4000)
) 

/** Create the table **/ 
BEGIN TRY 
  CREATE TABLE t1 (RowID INT NOT NULL) 
END TRY 

BEGIN CATCH 
  INSERT @errorLog (error_msg) 
  SELECT ERROR_MESSAGE()
END CATCH 

/** Create the table again - will raise an error message **/ 
BEGIN TRY 
  CREATE TABLE t1 (RowID INT NOT NULL) 
END TRY 

BEGIN CATCH 
  INSERT @errorLog (error_msg) 
  SELECT ERROR_MESSAGE()
END CATCH 

/** Create the index **/ 
BEGIN TRY 
  CREATE INDEX IX_t1 ON t1 (RowID) 
END TRY 

BEGIN CATCH 
  INSERT @errorLog (error_msg)
  SELECT ERROR_MESSAGE()
END CATCH 

/** Return the errors **/
IF EXISTS (SELECT * FROM @errorLog) 
  SELECT error_msg FROM @errorLog

/** Confirm it worked **/ 
EXEC sp_help 't1' 

此脚本将在失败后继续处理。如果存在错误,它们将在结果集中返回。因此,您需要更改原始代码,但我认为您可能不得不在一个脚本中容纳多个错误。

另一方面,可以在脚本本身轻松处理重复索引错误之类的事情(即检查对象是否已存在)。由于此解决方案需要对原始脚本进行大量更改,因此这可能是更好的选择。

答案 1 :(得分:-1)

你发布的内容只是你对'scriptinfo'所包含的内容的执行调用。

'scriptinfo'的文字是什么?这就是你需要查看/内置对失败的CRUD /事务/等进行优雅处理的地方。

如果您可以发布'scriptinfo',也许我可以给您一些想法。