データベース ツールボックスで MATLAB R2012b を使用して SQL Server 2012 にアクセスしています。TRY/CATCH を使用する場合、SELECT @@ROWCOUNT を宣言された変数にパイプして、try ブロックの後に影響を受ける行を返す必要があることを学びました。明確な例を示すこのリンクを見つけました。
新しい runsqlscript() コマンドを使用して MATLAB で 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