我有一份工作,每晚运行一堆平面文件加载到数据库(大约250个文件/表,运行大约一个小时)。它使用游标循环遍历表,并运行以下动态查询来构建和执行数据的批量插入。
let dict = ["diccioNum": ["Num3": 3, "Num4": 4, "Num6": 6, "Num8": 8, "Num9": 9, "Num5": 5, "Num1": 1, "Num7": 7, "Num2": 2]]
do {
let plistData = try PropertyListSerialization.data(fromPropertyList: dict, format: .xml, options: 0)
let plist = try PropertyListDecoder().decode([String: [String:Int]].self, from: plistData)
print(plist)
} catch { print(error) }
在过去的一年里,这份声明已经三次彻底失败了。我的意思是光标循环遍历每个表,它记录为所有表加载数据,但是当我检查数据时,所有250个表都是空的。
当我重新运行作业时,它工作正常并且所有数据都已加载。当文件格式出现问题时,SQL死锁,TCP连接会导致作业停止加载并记录错误。
我检查了服务器日志,什么也没看到,我的工作中也没有记录。我试过重新创建这个问题,但没有成功。正如我所提到的那样,它在过去的一年中已经发生了3次,但在过去的三年里,这项工作已经达到了0x。
知道发生了什么或如何防止它?
答案 0 :(得分:0)
你能把所有东西都包裹在Try ... Catch中吗?
BEGIN TRY
select @sql = 'BULK INSERT tmp.VW_' + @tableName
+ ' FROM ''' + @filePath + @fileName
+ ''' WITH(FIELDTERMINATOR = '''
+ @fieldTerminator + ''',ROWTERMINATOR = '''
+ @rowTerminator + ''', KEEPNULLS,TABLOCK);'
exec (@sql)
END TRY
GO
-- The previous GO breaks the script into two batches,
-- generating syntax errors. The script runs if this GO
-- is removed.
BEGIN CATCH
-- Store exception information casting error message to varchar
SELECT @IsError = 1, @ErrorMessage = 'Exception message: ' + Cast (Error_Message() as varchar) + ';'
END CATCH
IF @IsError <> 0
BEGIN
DECLARE @Subject VARCHAR(250)
SELECT @Subject = 'Server Name: ' + @@SERVERNAME + '; Database Name: ' + DB_NAME() + ';' + ' - Email failed'
EXEC msdb.dbo.sp_send_dbmail @recipients = 'AlertSupport@abc.com'
, @from_Address = 'sqlemail.abc.com'
, @body = @ErrorMessage
, @subject = @Subject
, @profile_name = 'DBProfileName'
Raiserror('Error encountered while sending email', 16, 1);
END
GO
几年前,我经历了一些奇怪的事情。我们从来没有弄清楚问题是什么,但似乎有些东西在一夜之间取消了我的服务器。最终我创建了一个VB.NET .exe,每隔几分钟就会使用Windows任务计划程序启动,然后检查.exe以查看SQL Server是否正在运行。如果.exe发现SQL Server没有运行,它会启动它。我们从来没有弄清楚是什么让它失望......