Azure SQL数据仓库“受影响的RowCount”

时间:2016-05-04 12:56:39

标签: tsql azure azure-sql-database azure-sqldw

在SQL Azure数据库中执行更新语句时,我们可以通过@@ROWCOUNT获取受影响的行数,类似于Azure SQL数据仓库中我无法获得受影响的行数。有没有办法在Azure SQL数据仓库中获取受影响的行数。

3 个答案:

答案 0 :(得分:3)

您可以找到SQL DW https://azure.microsoft.com/en-us/documentation/articles/sql-data-warehouse-migrate-code/

的常见解决方法

@@ rowcount的解决方法是:

SELECT  SUM(row_count) AS row_count
FROM    sys.dm_pdw_sql_requests
WHERE   row_count <> -1
AND     request_id IN
                    (   SELECT TOP 1    request_id
                        FROM            sys.dm_pdw_exec_requests
                        WHERE           session_id = SESSION_ID()
                        ORDER BY end_time DESC
                    )
;

答案 1 :(得分:0)

除了上面的正确答案。如果您使用动态SQL,那么您应该使用“TOP 4”来获取行计数。否则,@@ rowcount解决方法将不返回任何内容。更正:将subsql更改为此更正了动态sql rowcount问题: SELECT TOP 1 request_id                             FROM sys.dm_pdw_exec_requests                             WHERE session_id = SESSION_ID()                             ORDER BY end_time DESC, start_time DESC

答案 2 :(得分:0)

我注意到上述解决方法可能会提供错误的结果,因为它们可能会受到其他请求步骤的影响,即在执行更新时,我的一个表具有相关的物化视图,因此插入操作也作为额外的请求/dm 步骤执行增加行数。

对于 SELECTS,我还使用下面修改后的代码,该代码通常使用 @QueryLabel 参数嵌入到 rowcount 存储过程中。通常我总是使用查询标签,在需要行数的查询中,我将@@SPID 添加到标签文本中。这也是因为我不能依赖上面示例中使用的会话 ID,因为大量使用动态查询/exec 会产生不同的会话 ID。

    -- Use a simple methods for SELECT statements first
    SET @RowCount =
    (
        SELECT
        TOP 1 row_count
        FROM sys.dm_pdw_request_steps
        WHERE row_count >= 0
        AND request_id IN 
            (
                SELECT TOP 1 request_id
                FROM sys.dm_pdw_exec_requests
                WHERE CHARINDEX(@QueryLabel, [label]) > 0
                AND operation_type = 'ReturnOperation'
                ORDER BY end_time DESC -- ok if request has ended
            )
    )

对于 UPDATE/INSERT/DELETE,我必须查看单独的代码,以查看是否有其他谓词与我感兴趣的 DML 的特定请求/dm 操作相关联。但是在执行 UPDATE 时分析各种系统视图/INSERT/DELETE 解决方案似乎与 SELECT 相同,但只是使用了不同的 operation_type。

所以对于 UPDATE/INSERT/DELETE 似乎工作正常(可能需要更多测试)的代码是......

        -- Query which works for UPDATE/INSERT/DELETE
        SET @RowCount =
        (
            SELECT
            TOP 1 row_count
            FROM sys.dm_pdw_request_steps
            WHERE row_count >= 0
            AND request_id IN 
                (
                    SELECT TOP 1 request_id
                    FROM sys.dm_pdw_exec_requests
                    WHERE CHARINDEX(@QueryLabel, [label]) > 0
                    AND operation_type = 'OnOperation'
                    ORDER BY end_time DESC
                )
        )