仅执行动态查询以获取受影响的行数

Posted

技术标签:

【中文标题】仅执行动态查询以获取受影响的行数【英文标题】:Execute dynamic query only to get affected row count 【发布时间】:2018-07-10 11:06:19 【问题描述】:

我想执行一个动态查询来获取受影响的行数。但 SQL Result 窗格在执行后返回结果。如何避免返回列。我尝试了以下方式。

DECLARE @Command NVARCHAR(MAX)= 'SELECT * FROM Product  WHERE ID = 12'
DECLARE @Count AS INT
EXEC sp_executesql @Command, N'@C INT OUTPUT', @C=@Count OUTPUT
  IF (@Count > 0)
   BEGIN
    EXECUTE (@Command)
   END
  ELSE
   BEGIN
    DECLARE @CatalogProduct VARCHAR(MAX) = 'SELECT p.ManufactureCode,p.PartNo,p.Size,p.ID AS ProductID,p.Name ,p.ParentProductID,p.BasePrice FROM Product.Product p WHERE p.ThruDate > GETDATE() '+@Where
            EXECUTE (@CatalogProduct)
   END
END

我想避免从上面附加的图像中返回空列集。

【问题讨论】:

我没有看到变量 @where 的实际定义位置。 如果您想要计数,请使用COUNT(*)不要使用字符串连接来创建查询,这会使您面临 SQL 注入攻击、转换问题和错误。 SQL 已经是动态的 - 你可以简单地运行任何你想要的查询。 你是在问如何丢弃SSMS中的结果?在这种情况下查询-->查询选项-->结果-->网格-->执行后丢弃结果。 为什么要问这个问题?您要解决的实际问题是什么?解决那个可能要容易得多。例如,分页代码通常将select count(*) from (originalquery) 包裹在查询周围,以获取要显示的总行数。使用 LINQ,在任何查询上调用 .Count(*) 以执行它并获取结果数量而不实际返回结果是微不足道的 顺便说一句,如果您只想在有任何 ID 为 12 的产品时执行查询,您可以将其指定为查询本身的条件。要么明确返回 ID 为 12 的产品,要么返回 EXISTS (select 1 from Product where ID=12) 【参考方案1】:

您可以关闭显示,但我认为更好的方法是直接获取您想要的计数:

DECLARE @Command NVARCHAR(MAX)= 'SELECT * FROM Product  WHERE ID = 12';

DECLARE @count AS INT;
DECLARE @CntCommand NVARCHAR(MAX);

SET @CntCommand = 'SELECT @count = COUNT(*) FROM (' + @Command + ') x)';

EXEC sp_executesql @CntCommand, N'@count INT OUTPUT', @count=@count OUTPUT;

【讨论】:

【参考方案2】:

为什么不简单呢?

IF (SELECT COUNT(*) FROM Product = 12) > 0 BEGIN...

我不明白为什么COUNT 语句需要是动态的;没有什么动态的。

另外,使用 SQL '... WHERE p.ThruDate > GETDATE() '+@Where 是一个糟糕的主意。如果@where 是一个参数,它将对 SQL 注入开放。

【讨论】:

【参考方案3】:

试试这个。返回受最后一个查询影响的行数: select @@Rowcount

【讨论】:

【参考方案4】:
DECLARE @Command NVARCHAR(MAX)= 'SELECT * FROM Product  WHERE ID = 12'
DECLARE @CountCommand NVARCHAR(MAX)= 'SELECT @Count=count(1) FROM Product  WHERE ID = 12'
DECLARE @Count AS INT
EXEC sp_executesql @CountCommand , N'@Count INT OUTPUT', @Count=@Count OUTPUT
  IF (@Count > 0)
   BEGIN
    EXECUTE (@Command)
   END
  ELSE
   BEGIN
    DECLARE @CatalogProduct VARCHAR(MAX) = 'SELECT p.ManufactureCode,p.PartNo,p.Size,p.ID AS ProductID,p.Name ,p.ParentProductID,p.BasePrice FROM Product.Product p WHERE p.ThruDate > GETDATE() '+@Where
            EXECUTE (@CatalogProduct)
   END
END

【讨论】:

以上是关于仅执行动态查询以获取受影响的行数的主要内容,如果未能解决你的问题,请参考以下文章

在 SQLite-WinRT 包装器中使用“更新”或“删除”查询获取受影响的行数

受 Microsoft JDBC 驱动程序的 SELECT INTO 查询影响的行数

C#中对SQl数据库进行插入操作,有返回受影响的行数,执行结果是“添加成功”但是在数据困中却没有数据

受 BigQuery 查询影响的行数

返回受 UPDATE 语句影响的行数

如何在 WordPress 查询中获得受影响的行数?