Часть 2: В своей статье «Условия динамического поиска в 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
и т.д ...
В другой статье на dyanmic sql он пишет:
Временные таблицы, созданные в динамическом SQL, не будут доступны из вызывающей процедуры, поскольку они удаляются при выходе из динамического SQL.
Так что мой вопрос вращается вокруг этой проблемы: если вы ужеПостроил динамический SQL-оператор один раз, а оператор SELECT в @sql
возвращает col1, col2, col3, col4 и т. д. Что делать, если вам придется повторно запросить тот же набор результатов разными способами?Например, если вам нужно было вернуть другой набор результатов с COUNT, сгруппированным по col1, и другой набор результатов с COUNT, сгруппированным по col2, или по каким-то другим критериям, основой которых является набор результатов из исходного @sql
?
Придется ли вам пересоздавать @sql заново для каждого сценария, чтобы в итоге вы получили @sql, @ sql_2, @ sql_3, ...?
В этом случае, будет ли динамический sql по-прежнему лучшим вариантом или лучше использовать статический sql, который вставляется в таблицу #temp, так что вы можете повторно запросить результаты таблицы #temp?