动态批量插入静默失败

时间:2018-01-17 20:23:43

标签: sql-server tsql sql-server-2012

我有一份工作,每晚运行一堆平面文件加载到数据库(大约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。

知道发生了什么或如何防止它?

1 个答案:

答案 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没有运行,它会启动它。我们从来没有弄清楚是什么让它失望......