2011-02-05 11 views
0

パート1: Erland Sommarskogの記事「T-SQLの動的検索条件... SQL 2005以前」では、 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も欲しいとします。

これを行う最善の方法は何でしょうか?

あなたの代わりにSELECT col1, col2, col3SELECT COUNT(*)...を行うだろう@sql_2SELECT声明を除いて、そのビルド@sqlにほぼ同一である別の変数、@sql_2を宣言する必要がありますか?

これ以上のアプローチがありますか?

+0

あなたがレコードを返却しているので、再審後にカウントするのはなぜですか? –

答えて

1

SQL文をセミコロンで区切って文字列にします。次に、文字列 "A"で始まるデータベース内のテーブルとそのカウントを返す実例を示します。 最初は単純なバージョンです。これは2つの結果セットを返し、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も行数が含まれています実行します。