我正在使用带有数据库工具箱的MATLAB R2012b来访问SQL Server 2012.我了解到使用TRY / CATCH时,SELECT @@ ROWCOUNT必须通过声明的变量传递,以返回try块后受影响的行。我发现this link给出了一个明确的例子。
当我在MATLAB中执行我的SQL脚本时,使用新的runsqlscript()命令,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)'数据'字段:
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
答案 0 :(得分:0)
我遇到了类似的问题。 我认为问题是你正在运行多个语句,即使第二个语句返回数据,第一个语句也不返回任何内容。
尝试单独运行语句。 This page给了我这个想法。