Динамический SQL, sp_executesql и перестройка динамического оператора SQL - Часть 1 - PullRequest
0 голосов
/ 05 февраля 2011

Часть 1: В своей статье «Условия динамического поиска в T-SQL ... для SQL 2005 и более ранних версий» Эрланд Соммарског приводит пример использования динамического sql с sp_executesql.

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-оператор, имеет смысл, если вам нужно запустить только один sp_executesql дляваша @sql переменная.

Однако предположим, что вы построили @sql и вернули отфильтрованные записи, которые вы хотите вернуть, но вы также хотите COUNT возвращенных записей.

Каков наилучший способ сделать это?

Нужно ли объявлять другую переменную, @sql_2, сборка которой будет почти идентична @sql, за исключением того, что оператор SELECT в @sql_2 будет делать SELECT COUNT(*)... вместо SELECT col1, col2, col3?

Или есть лучший подход?

1 Ответ

1 голос
/ 05 февраля 2011

Строка операторов SQL вместе, разделенные точкой с запятой.Вот рабочий пример, который возвращает таблицы в вашей базе данных, которые начинаются с буквы «А» и счетчика.Сначала простая версия.Это возвращает 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 '''+@findTables+''';'+
'select @@RowCount as [RowCount];';

execute sp_executesql @sql

Теперь версия, в которой переменная оценивается со счетчиком, когда вам необходимо использовать ее позже в сохраненном процессе.1005 *

После этого запуска вы увидите 2 набора результатов, второй будет содержать RowCount, а переменная @rowCount также будет содержать количество строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...