Sometimes you may get the above error when dealing with openquery updates and linked servers.
More specifically:
The OLE DB provider "MSDASQL" FOR linked server
"XXXXXXXXX" could NOT UPDATE TABLE "[MSDASQL]".
The rowset was USING optimistic concurrency AND the VALUE OF
a COLUMN has been changed after the containing ROW was
LAST fetched OR resynchronized.
[SQLSTATE 42000] (Error 7343) OLE DB provider "MSDASQL" FOR
linked server "XXXXXXXXX" returned message "Row cannot be
located for updating. Some values may have been changed since
it was last read.".
[SQLSTATE 01000] (Error 7412). The step failed.
"XXXXXXXXX" could NOT UPDATE TABLE "[MSDASQL]".
The rowset was USING optimistic concurrency AND the VALUE OF
a COLUMN has been changed after the containing ROW was
LAST fetched OR resynchronized.
[SQLSTATE 42000] (Error 7343) OLE DB provider "MSDASQL" FOR
linked server "XXXXXXXXX" returned message "Row cannot be
located for updating. Some values may have been changed since
it was last read.".
[SQLSTATE 01000] (Error 7412). The step failed.
A solution is to go to the SQL server that links to MySql, go to configure screen of the MySql ODBC connection in the linked server. Open Details, click on Cursor/Results tab and check the “Return matched rows instead of affected rows”.
That’s it!
Cheers.