2011-02-05 58 views
0

第1部分:在他的文章「T-SQL中的動態搜索條件... for SQL 2005及更早版本」中,Erland Sommarskog給出了一個如何通過sp_executesql使用動態sql。動態SQL,sp_executesql和重建動態sql語句 - 第1部分

http://www.sommarskog.se/dyn-search-2005.html#sp_executesql

SELECT @sql =             -- 19 
'SELECT o.OrderID, o.OrderDate, od.UnitPrice, od.Quantity,  -- 20 
     c.CustomerID, c.CompanyName, c.Address, c.City,  -- 21 
     c.Region, c.PostalCode, c.Country, c.Phone,   -- 22 
     p.ProductID, p.ProductName, p.UnitsInStock,   -- 23 
     p.UnitsOnOrder           -- 24 
FROM dbo.Orders o           -- 25 
JOIN dbo.[Order Details] od ON o.OrderID = od.OrderID  -- 26 
JOIN dbo.Customers c ON o.CustomerID = c.CustomerID   -- 27 
JOIN dbo.Products p ON p.ProductID = od.ProductID   -- 28 
    WHERE 1 = 1'            -- 29 
                   -- 30 
IF @orderid IS NOT NULL          -- 31 
    SELECT @sql = @sql + ' AND o.OrderID = @xorderid' +   -- 32 
         ' AND od.OrderID = @xorderid'   -- 33 
                   -- 34 
IF @fromdate IS NOT NULL          -- 35 
    SELECT @sql = @sql + ' AND o.OrderDate >= @xfromdate'  -- 36 

等等

因此,當你建立你的動態SQL語句,它是有道理的,如果你必須爲你的@sql變量只運行一個sp_executesql的。

但是,假設您已經構建了您的@sql,並且返回了您想要返回的篩選記錄,但是您還希望返回記錄的COUNT

要做到這一點,最好的方法是什麼?

你就必須聲明另一個變量,@sql_2,其建設將是幾乎相同@sql,除了在@sql_2SELECT聲明會做SELECT COUNT(*)...而不是SELECT col1, col2, col3

還是有更好的方法?

+0

既然您正在返回記錄,您爲什麼不重新審覈之後纔會依靠這些記錄? – 2011-02-05 03:31:40

回答

1

將SQL語句串在一起用分號分隔。這是一個工作示例,返回數據庫中以字母「A」開頭的表和計數。 首先是簡單的版本。這返回2個結果集,第二個是計數。

declare @findTables nvarchar(256) 
set @findTables = N'A%' 

declare @sql nvarchar(max) 

set @sql = N'set nocount on; '+ 
'select * from sys.tables where name like '''[email protected]+''';'+ 
'select @@RowCount as [RowCount];'; 

execute sp_executesql @sql 

現在哪裏一個變量被計數,當你需要在存儲過程中用到它看重的一個版本。

declare @findTables nvarchar(256) 
set @findTables = N'A%' 

declare @sql nvarchar(max) 
declare @ParmDefinition nvarchar(500); 
declare @rowCount int 

set @sql = N'set nocount on; 
select * from sys.tables where name like @findTablesParm; 
select @rowCountParm = @@rowcount; 
select @rowCountParm as [RowCount];'; 

SET @ParmDefinition = N'@findTablesParm nvarchar(256), 
    @rowCountParm int OUTPUT'; 

execute sp_executesql @sql, 
    @ParmDefinition, 
    @[email protected], 
    @[email protected] OUTPUT 

這個運行後,你會看到2個的結果集,第二個將包含行數和可變@RowCount也將包含行數。