【发布时间】:2015-12-29 21:27:14
【问题描述】:
我在 SQL Server 2012 中有一个查询,我首先在不使用 sp_executesql 的情况下运行,然后使用 sp_executesql 运行它。奇怪的是,这两次运行都给出了不同的结果,而它们应该是相同的,因为它们使用的是相同的 SQL 查询。
我什至尝试将OUTPUT 用于@productId,如下面的代码所示,但即便如此,它也没有任何区别。在本文末尾给出的屏幕截图中,前两个结果集应该与后两个结果集重复,但它们不会。
EXECUTE sp_executesql @qry,
N'@maxRows int,@startingRowNumber int,@productId bigint OUTPUT',
@maxRows = @maxRows,
@productId = @productId OUTPUT,
@startingRowNumber = @numberOfRowsToSkip
问题:是什么导致同一查询的结果不同?
DECLARE @startingRowNumber INT = 1;
DECLARE @productId BIGINT;
DECLARE @maxRows INT = 10;
DECLARE @qryCount NVARCHAR(MAX);
DECLARE @qry NVARCHAR(MAX);
DECLARE @numberOfRowsToSkip INT;
SET @numberOfRowsToSkip = @startingRowNumber - 1;
--RUN query batch without sp_executesql
SELECT @productId = MAX(ProductId)
FROM (SELECT TOP (@startingRowNumber)
ProductId
FROM dbo.Prods
WHERE [Product Cost] < 1005
ORDER BY ProductId ASC) x;
SELECT @productId AS ProductId;
SELECT ProductId,Product,Vendor,VendorId,[Product Cost]
FROM dbo.Prods WITH (NOLOCK)
WHERE ProductId >= @productId
AND [Product Cost] < 1005
ORDER BY [Product Cost] ASC OFFSET @numberOfRowsToSkip
ROWS FETCH NEXT @maxRows ROWS ONLY;
--RUN query batch using sp_executesql
SET @qry = N'SELECT @productId = MAX(ProductId)
FROM (SELECT TOP (@startingRowNumber)
ProductId
FROM dbo.Prods
WHERE [Product Cost] < 1005
ORDER BY ProductId ASC) x;
SELECT @productId AS ProductId;
SELECT ProductId,Product,Vendor,VendorId,[Product Cost]
FROM dbo.Prods WITH (NOLOCK)
WHERE ProductId >= @productId
AND [Product Cost] < 1005
ORDER BY [Product Cost] ASC OFFSET @numberOfRowsToSkip
ROWS FETCH NEXT @maxRows ROWS ONLY';
EXECUTE sp_executesql @qry,
N'@maxRows int,@startingRowNumber int,@productId bigint',
@maxRows = @maxRows,
@productId = @productId,
@startingRowNumber = @numberOfRowsToSkip
PRINT N'Executed select query'
更新 1
我还注意到一个有趣的事情是查询 1 返回一个值,但查询 2 没有。我很确定这个问题的答案将是原始问题的答案。
查询 1
SELECT @productId = Max(x.ProductId) FROM
(SELECT TOP (@startingRowNumber) ProductId FROM dbo.Prods WHERE
[Product Cost] < 1005 ORDER BY ProductId ASC) x;
SELECT @productId AS ProductId
查询 2
SET @qry = N'SELECT @productId = Max(x.ProductId) FROM
(SELECT TOP (@startingRowNumber) ProductId FROM dbo.Prods WHERE
[Product Cost] < 1005 ORDER BY ProductId ASC) x;';
EXECUTE sp_executesql @qry,
N'@maxRows int,@startingRowNumber int,@productId bigint OUTPUT',
@productId = @productId OUTPUT,
@startingRowNumber = @numberOfRowsToSkip,
@maxRows = @maxRows
SELECT @productId AS ProductId
【问题讨论】:
标签: sql-server-2012 sp-executesql