3

我正在使用带有数据库工具箱的 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
4

1 回答 1

0

我有个类似的问题。我认为问题在于您正在运行多个语句,即使第二个返回数据,第一个语句也不返回任何内容。

尝试分别运行语句。 这个页面给了我这个想法。

于 2014-02-27T06:30:31.277 回答