Part 2: 在他的文章_1772548中,Erland Sommarskog给出了如何在sp_executesql中使用动态sql的示例 .
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的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表的结果?
2 回答
好的,所以这里是msdn网站解决这个问题的一个例子 .
http://social.msdn.microsoft.com/Forums/en/sqlreportingservices/thread/3ed6885a-fe18-41c0-bce4-76c44c737a1b
问题是:如果你创建临时表,并在动态sql中创建临时表,则无法访问动态sql的临时表OUTSIDE . 但是,如果你创建你的临时表OUTSIDE的动态sql,那么在动态sql中填充临时表INSIDE,就可以访问动态sql的填充临时表OUTSIDE了 .
另一种方法是使用
INSERT ... EXEC
设备,虽然使用比您自己的查找更有限 .你不能在另一个
INSERT...EXEC
中调用的SP中使用它 .