标签: error-handling

使用 SQLCMD 运行多个 .sql 文件

我正在尝试将一个批处理文件放在一起以运行大量 .sql 文件,而无需单独执行此操作。

到目前为止,我有:

@echo off
echo "Enter Server"
set /p SERVER=

echo "Enter Database"
set /p DATABASE=

del *.log

for /r %%i in (*.sql) do sqlcmd -E -S %SERVER% -d %DATABASE% -i"%%i" -m0 -o"%%i.log" -w500 

pause
Run Code Online (Sandbox Code Playgroud)

就目前而言,这有效。

然而,我真正想做的是将任何错误路由到一个单独的 .err 文件,以便一目了然地清楚哪些(100+)个文件失败。

我看到了:Error参数,但我不确定如何在此处应用它。

有没有简单的方法来实现这一目标?

sql-server-2008-r2 sqlcmd error-handling

2
推荐指数
1
解决办法
1529
查看次数

为什么处理有时会终止,有时不会

DECLARE @Error int;
INSERT INTO Person.BusinessEntityContact
 (BusinessEntityID
 ,PersonID
 ,ContactTypeID)
 VALUES
 (0,0,1);
SELECT @Error = @@ERROR;
PRINT ‘The Value of @Error is ‘ + CONVERT(varchar, @Error);
Run Code Online (Sandbox Code Playgroud)

我有 :

消息 547,级别 16,状态 0,第 4 行 INSERT 语句与 FOREIGN KEY 约束“FK_BusinessEntityContact_Person_PersonID”相冲突......该语句已终止。@Error 的值为 547

这意味着在抛出错误后该过程仍在继续。

但是,如果我尝试创建一个表(运行以下脚本两次以触发错误)为:

CREATE TABLE OurIFTest(
 Col1 int PRIMARY KEY
 );
IF @@ERROR != 0
 PRINT 'Problems!';
ELSE
 PRINT 'Everything went OK!';
Run Code Online (Sandbox Code Playgroud)

然后我得到了

消息 2714,级别 16,状态 6,第 2 行 数据库中已经有一个名为“OurIFTest”的对象。

这意味着该进程在抛出错误时终止。

那么为什么该过程因“创建”而终止,而不因“插入”而终止?

sql-server error-handling

2
推荐指数
1
解决办法
97
查看次数

在开始尝试开始捕获块中删除表 - 是否有任何性能损失?

下面的代码是一个动态 sql,它将为您提供系统中所有警报的列表。

有用。

出于这个问题之外的原因,代码中有一个临时表。

这个问题与我在创建临时表之前确保临时表不存在的方式有关。

我在 try catch 块中放置了一个删除表,如下面的代码所示。

我的问题是:

  • 有没有性能损失?
  • 这样做有什么缺点吗?
  • 为什么这不被视为通常的最佳实践?

我仍然有一些服务器 sql-server-2008-r2 但大多数我的服务器是 sql server 2016。

EXEC Sp_executesql 
N'  

begin try
 drop table #tmp_sp_help_alert 
end try
begin catch
end catch

create table #tmp_sp_help_alert  (
id int null, name nvarchar(128) null,  
event_source nvarchar(100) null, 
event_category_id int null, 
event_id int null, 
message_id int null,  
severity int null, 
enabled tinyint null, 
delay_between_responses int null, 
last_occurrence_date int null, 
last_occurrence_time int null, 
last_response_date int null, 
last_response_time int null, 
notification_message nvarchar(512) null, 
include_event_description …
Run Code Online (Sandbox Code Playgroud)

sql-server dynamic-sql sql-server-2008-r2 error-handling temporary-tables

1
推荐指数
1
解决办法
2566
查看次数

如何回滚 SQL Server 事务并使用输出参数?

我试图在存储过程中设置一个输出参数,但我认为当我回滚事务时,我认为我也将分配回滚到@out. 那是对的吗?

如果是这样,我如何返回消息并回滚事务?我正在@out从 C#获取参数。

create PROCEDURE [dbo].[sp]
@out varchar(2000) output
AS
BEGIN
    SET NOCOUNT ON
    BEGIN TRANSACTION
    BEGIN TRY
        SET @OUT = "success";
        COMMIT TRANSACTION
    END TRY

    BEGIN CATCH
        set @out = 'not success';
        ROLLBACK TRANSACTION
    END CATCH
END
Run Code Online (Sandbox Code Playgroud)

我原本是在做一个

SELECT 
    ERROR_NUMBER() AS ErrorNumber,
    ERROR_SEVERITY() AS ErrorSeverity,
    ERROR_STATE() AS ErrorState,
    ERROR_PROCEDURE() AS ErrorProcedure,
    ERROR_LINE() AS ErrorLine,
    ERROR_MESSAGE() AS ErrorMessage;
Run Code Online (Sandbox Code Playgroud)

...但这没有帮助,尽管我更喜欢这种方法。

sql-server stored-procedures error-handling ssdt sql-server-2016

1
推荐指数
1
解决办法
1万
查看次数