仅执行动态查询以获得受影响的行数
Execute dynamic query only to get affected row count
我想执行动态查询以获取受影响的行数。但是 SQL 结果窗格 returns 我执行后的结果。如何避免返回列。我尝试了下面的方法。
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
我想避免返回上图中的空列集。
您可以关闭显示,但我认为更好的方法是直接获取您想要的计数:
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;
为什么不简单呢?
IF (SELECT COUNT(*) FROM Product = 12) > 0 BEGIN...
我不明白为什么 COUNT
语句需要是动态的;没有什么动态的。
另外,SQL '... WHERE p.ThruDate > GETDATE() '+@Where
是个糟糕的主意。如果 @where
是参数,它将 wide 开放给 SQL 注入。
试试这个。 Returns 上次查询影响的行数:
select @@Rowcount
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
我想执行动态查询以获取受影响的行数。但是 SQL 结果窗格 returns 我执行后的结果。如何避免返回列。我尝试了下面的方法。
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
我想避免返回上图中的空列集。
您可以关闭显示,但我认为更好的方法是直接获取您想要的计数:
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;
为什么不简单呢?
IF (SELECT COUNT(*) FROM Product = 12) > 0 BEGIN...
我不明白为什么 COUNT
语句需要是动态的;没有什么动态的。
另外,SQL '... WHERE p.ThruDate > GETDATE() '+@Where
是个糟糕的主意。如果 @where
是参数,它将 wide 开放给 SQL 注入。
试试这个。 Returns 上次查询影响的行数:
select @@Rowcount
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