我正在使用带有数据库工具箱的 MATLAB R2012b 来访问 SQL Server 2012。我了解到,在使用 TRY/CATCH 时,必须通过声明的变量对 SELECT @@ROWCOUNT 进行管道传输,以返回在 try 块之后受影响的行。我发现这个链接给出了一个清晰的例子。
当我在 MATLAB 中使用新的 runsqlscript() 命令执行我的 SQL 脚本时,SQL 游标对象显示操作成功,但 SQL 游标对象在“数据”字段中显示 (0) 作为结果。我知道这并不代表插入的行数,正如我通过在 SSMS 中执行等效脚本验证的那样。
任何想法/建议表示赞赏,谢谢,布拉德
>> SQL_cursor
SQL_cursor =
Attributes: []
Data: 0
DatabaseObject: [1x1 database]
RowLimit: 0
SQLQuery: [1x541 char]
Message: [1x42 char]
Type: 'Database Cursor Object'
ResultSet: []
Cursor: [1x1 com.mathworks.toolbox.database.sqlExec]
Statement: [1x1 com.microsoft.sqlserver.jdbc.SQLServerStatement]
Fetch: 0
% This Message is the normal text returned when there's no error
>> SQL_cursor.Message
ans = The statement did not return a result set.
% The Data value should not be zero: rows were inserted!
>> SQL_cursor.Data
ans = 0
这是我在 MATLAB 中执行的 SQL 脚本。注意通用标记('DATABASE_NAME' 等)。
USE DATABASE_NAME
DECLARE @N_ROWS INT
BEGIN TRANSACTION
BEGIN TRY
BULK INSERT TABLE_NAME
FROM 'DATA_FILE_NAME'
WITH
(
CHECK_CONSTRAINTS,
FIELDTERMINATOR ='\t',
ROWTERMINATOR ='\r\n',
FORMATFILE = 'FORMAT_FILE_NAME',
DATAFILETYPE = 'char',
MAXERRORS = 0,
TABLOCK
)
SET @N_ROWS = @@ROWCOUNT
COMMIT TRANSACTION
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION
END CATCH
SELECT @N_ROWS
更新#1:实际上,即使没有所有 TRY/CATCH & TRANSACTION 框架,也会出现此问题。精简的 SQL 代码在游标对象中生成相同的 (0) 'Data' 字段:
USE DATABASE_NAME
BULK INSERT TABLE_NAME
FROM 'DATA_FILE_NAME'
WITH
(
CHECK_CONSTRAINTS,
FIELDTERMINATOR ='\t',
ROWTERMINATOR ='\r\n',
FORMATFILE = 'FORMAT_FILE_NAME',
DATAFILETYPE = 'char',
MAXERRORS = 0,
TABLOCK
)
SELECT @@ROWCOUNT
MATLAB结果:
>> SQL_cursor
SQL_cursor =
Attributes: []
Data: 0
DatabaseObject: [1x1 database]
RowLimit: 0
SQLQuery: [1x397 char]
Message: [1x42 char]
Type: 'Database Cursor Object'
ResultSet: []
Cursor: [1x1 com.mathworks.toolbox.database.sqlExec]
Statement: [1x1 com.microsoft.sqlserver.jdbc.SQLServerStatement]
Fetch: 0
>> SQL_cursor.Message
ans = The statement did not return a result set.
>> SQL_cursor.Data
ans = 0