我正在尝试将一个批处理文件放在一起以运行大量 .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参数,但我不确定如何在此处应用它。
有没有简单的方法来实现这一目标?
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,它将为您提供系统中所有警报的列表。
有用。
出于这个问题之外的原因,代码中有一个临时表。
这个问题与我在创建临时表之前确保临时表不存在的方式有关。
我在 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
我试图在存储过程中设置一个输出参数,但我认为当我回滚事务时,我认为我也将分配回滚到@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