Sql server 为什么可以';在开始捕捉块/TSQL内分配一个值
当我尝试为begin catch块内的变量赋值时。它说,Sql server 为什么可以';在开始捕捉块/TSQL内分配一个值,sql-server,tsql,Sql Server,Tsql,当我尝试为begin catch块内的变量赋值时。它说,无法评估: 我想收集所有这些记录的ID,并在流程结束时记录它们 OPEN FilesCursor; FETCH NEXT FROM FilesCursor INTO @recordId; WHILE @@FETCH_STATUS = 0 BEGIN BEGIN DISTRIBUTED TRANSACTION; BEGIN TRY SET XACT_ABORT ON;
无法评估
:
我想收集所有这些记录的ID,并在流程结束时记录它们
OPEN FilesCursor;
FETCH NEXT FROM FilesCursor INTO @recordId;
WHILE @@FETCH_STATUS = 0
BEGIN
BEGIN DISTRIBUTED TRANSACTION;
BEGIN TRY
SET XACT_ABORT ON;
SET @insertQuery = 'INSERT INTO '+ @remoteLinkedServerName +'.PatlatDB.dbo.TestTab...';
SET @updateQuery = '...';
EXECUTE(@insertQuery);
EXECUTE(@updateQuery);
SET XACT_ABORT OFF;
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
BEGIN
ROLLBACK TRANSACTION;
SET @errorIds += ',' + CAST(@recordId AS VARCHAR);
SET @errorMessage += '|' + CAST((SELECT ERROR_MESSAGE()) AS VARCHAR);
END;
END CATCH
IF @@TRANCOUNT > 0
COMMIT TRANSACTION;
FETCH NEXT FROM FilesCursor INTO @recordId;
END;
CLOSE FilesCursor;
DEALLOCATE FilesCursor;
您应该检查catch block.trusted中的
XACT_STATE
而不是TRANCOUNT
。如果XACT_STATE()0,这也没有帮助,让我来指定值。注意,您启用了XACT_ABORT
选项-如果要在catch块中检测活动事务,应该避免使用它。只要试着用xact\u abort
注释行就可以了。我想收集值的真正障碍是使用未定义大小的varchar
。对于int
它需要10个符号。并查看如何声明@errorIds
变量。它也是没有大小的varchar吗?首先,当我删除XACT_ABORT时,远程服务器返回一个错误。第二个,是的,声明@errorIds VARCHAR(MAX);您应该检查catch block.trusted中的XACT_STATE
而不是TRANCOUNT
。如果XACT_STATE()0,这也没有帮助,让我来指定值。注意,您启用了XACT_ABORT
选项-如果要在catch块中检测活动事务,应该避免使用它。只要试着用xact\u abort
注释行就可以了。我想收集值的真正障碍是使用未定义大小的varchar
。对于int
它需要10个符号。并查看如何声明@errorIds
变量。它也是没有大小的varchar吗?首先,当我删除XACT_ABORT时,远程服务器返回一个错误。第二个,是的,声明@errorIds VARCHAR(MAX);