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

Tsql Azure SQL数据仓库“受影响的行数”,tsql,azure,azure-sql-database,azure-sqldw,Tsql,Azure,Azure Sql Database,Azure Sqldw,在SQL Azure DB中执行update语句时,我们可以通过@ROWCOUNT获取受影响的行数,类似地,在Azure SQL数据仓库中,我无法获取受影响的行数。是否有方法获取Azure SQL数据仓库中受影响的行数。您可以找到SQL DW的常见解决方法 @rowcount的解决方法是: SELECT SUM(row_count) AS row_count FROM sys.dm_pdw_sql_requests WHERE row_count <> -1 AND

在SQL Azure DB中执行update语句时,我们可以通过@ROWCOUNT获取受影响的行数,类似地,在Azure SQL数据仓库中,我无法获取受影响的行数。是否有方法获取Azure SQL数据仓库中受影响的行数。

您可以找到SQL DW的常见解决方法

@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
                    )
;

除了上面的正确答案之外。如果您使用的是动态SQL,那么应该使用TOP4来获取行数。否则@rowcount解决方案将不返回任何内容。更正:将subsql更改为此可更正动态sql行数问题: 选择前1个请求\u id 来自sys.dm_pdw_exec_请求 其中session\u id=session\u id
ORDER BY end_time DESC,start_time DESC

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

对于选择,我还使用下面修改过的代码,该代码通常嵌入到带有@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操作相关。但是,在执行更新/插入/删除时分析各种系统视图时,解决方案似乎与SELECT相同,只是使用了不同的操作类型

因此,更新/插入/删除所需的更多测试似乎正常的代码是

        -- 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
                )
        )