如何在sqlcmd中跟踪T-SQL脚本中的进度和错误?

时间:2018-01-09 15:35:52

标签: sql-server windows cygwin sqlcmd

我正在将SQL Server数据库的内容提取到我的工作站上的文件中。

我已将这样的SQL写入批处理文件中:

SELECT 
    CONCAT('INSERT INTO unit (id, name) VALUES ', '(', id, ', ', '''', [name], ''');') 
FROM unit;
GO

我在cygwin命令行上执行它,如下所示:

SQLCMD.EXE -i "generate-inserts-for-migration.sql" -h-1 -S "CORPDB492\DEV59" -d MyDB_Dev -r1 -W > dump.sql

数据库大约6GB,因此需要一些时间。

首先,我希望能够监控它有多远,看它是否应该在它太慢时取消它,或者只是能够预测完成时间。

其次,它只是在完成之前停止,没有任何错误消息。

文档from Microsoft声明我需要-b-m-V的组合,但我还没有设法做到正确而且我没有&# 39;得到任何错误,它只是在启动后20分钟停止,因此试图通过反复试验找出错误非常缓慢。

为了跟踪进度,我认为我会监控文件大小,但这并不能很好地反映出进展情况。

我以为我会用tail -f在cygwin中尾随它,但这显示没有任何进展。

这可能是由于错误造成的,但我无法说明。

我可以在Windows任务管理器中看到它通过以太网以35Mbps的速度将数据传输到工作站,但是没有磁盘活动,也没有相应的内存使用量增加。

为什么不写入磁盘? sqlcmd即使遇到错误,也可以继续接收数兆字节的数据吗?我不确定哪一方(客户端或服务器)正在处理查询。

在这种情况下我可以使用任何T-SQL吗?

我可以让SQLCMD提供一些不会干扰STDOUT数据的进度输出吗? (我将它从STDOUT传送到文件,因为使用SQLCMD -o filename时格式不同。

1 个答案:

答案 0 :(得分:0)

-- Create #SourceTable
DROP TABLE IF EXISTS ##SourceTable;

WITH
    Nbrs_4 (n) AS (SELECT 1 UNION SELECT 0)
    , Nbrs_3 (n) AS (SELECT 1 FROM Nbrs_4 n1 CROSS JOIN Nbrs_4 n2)
    , Nbrs_2 (n) AS (SELECT 1 FROM Nbrs_3 n1 CROSS JOIN Nbrs_3 n2)
    , Nbrs_1 (n) AS (SELECT 1 FROM Nbrs_2 n1 CROSS JOIN Nbrs_2 n2)
    , Nbrs_0 (n) AS (SELECT 1 FROM Nbrs_1 n1 CROSS JOIN Nbrs_1 n2)
    , Nbrs (n) AS (SELECT 1 FROM Nbrs_0 n1 CROSS JOIN Nbrs_0 n2)
SELECT n
INTO ##SourceTable
FROM (SELECT ROW_NUMBER() OVER (ORDER BY n) FROM Nbrs) D (n)
WHERE n <= 10000000;

-- Copy to #DestinationTable
DROP TABLE IF EXISTS ##DestinationTable;

CREATE TABLE ##DestinationTable (n INT);

INSERT ##DestinationTable (n)
SELECT n
FROM ##SourceTable;

-- Check the Progress during the Execution (in another session)
DECLARE
    @NumberOfRowsTotal INT
    , @NumberOfRowsCopied INT

SELECT @NumberOfRowsTotal = COUNT(*)
FROM ##SourceTable;

SELECT @NumberOfRowsCopied = COUNT(*)
FROM ##DestinationTable;

SELECT CAST(@NumberOfRowsCopied AS FLOAT) / CAST(@NumberOfRowsTotal AS FLOAT) AS [Progress (%)];