DW迁移至Synapse:专用SQL池@@变量(@@error、@@rowcount等)失效求替代方案
DW到Synapse专用SQL池迁移:@@error、@@rowcount的替代方案
替代@@rowcount的方案
Synapse专用SQL池不支持@@rowcount,但可以使用ROWCOUNT_BIG()函数实现相同功能,该函数返回bigint类型的受影响行数,支持更大的数值范围,用法需紧跟在目标语句之后。
示例代码:
-- 执行数据操作语句 UPDATE sales SET amount = amount * 1.1 WHERE region = 'North'; -- 获取受影响行数 DECLARE @affectedRows BIGINT = ROWCOUNT_BIG(); PRINT '更新操作影响行数: ' + CAST(@affectedRows AS VARCHAR(20));
替代@@error的方案
Synapse专用SQL池不支持@@error,推荐使用TRY...CATCH错误处理结构捕获并处理执行错误,通过以下内置函数获取详细错误信息:
ERROR_NUMBER():返回错误编号ERROR_MESSAGE():返回错误描述信息ERROR_SEVERITY():返回错误严重级别ERROR_STATE():返回错误状态码
示例代码:
BEGIN TRY -- 执行可能抛出错误的操作 INSERT INTO customer (id, email) VALUES (1001, 'invalid-email'); END TRY BEGIN CATCH -- 捕获并处理错误 DECLARE @errNum INT = ERROR_NUMBER(); DECLARE @errMsg NVARCHAR(4000) = ERROR_MESSAGE(); PRINT '执行出错: 编号=' + CAST(@errNum AS VARCHAR(10)) + ', 信息=' + @errMsg; -- 可选:将错误记录到日志表 INSERT INTO error_log (error_time, error_number, error_message) VALUES (GETDATE(), @errNum, @errMsg); END CATCH
注意事项
ROWCOUNT_BIG()必须直接跟在需要统计行数的语句之后,中间不能插入任何其他执行语句,否则会返回后续语句的受影响行数。- 在
TRY...CATCH块中,只有当TRY块内的语句触发错误时才会进入CATCH块,可根据业务需求添加事务回滚、告警触发等逻辑。
内容的提问来源于stack exchange,提问作者Sankar M
相关产品推荐
相关产品推荐

