【发布时间】:2021-05-22 04:47:59
【问题描述】:
第 2 部分: 在他的文章“T-SQL 中的动态搜索条件...用于 SQL 2005 及更早版本”中,Erland Sommarskog 给出了如何将动态 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 的 article 中,他写道:
在动态 SQL 中创建的临时表将无法从调用过程中访问,因为它们在动态 SQL 退出时被删除。
所以我的问题围绕着这个问题:如果您已经构建了动态 sql
语句一次,@sql中的SELECT语句返回col1、col2、col3、col4等,
如果您必须以不同的方式重新查询相同的结果集,您应该怎么做?例如,如果您必须返回另一个具有 COUNT 并按 col1 分组的结果集,
另一个结果集包含按 col2 分组的 COUNT,或者其他一些标准,其基础是原始 @sql 的结果集?
您是否必须为每个不同的场景重新构建@sql, 所以你最终得到@sql,@sql_2,@sql_3,...?
在这种情况下,动态 sql 是否仍然是最好的选择,或者它会是 最好使用插入 #temp 表的静态 sql,这样您就可以 重新查询#temp 表结果?
【问题讨论】:
标签: sql-server tsql