第2部分:在他的文章“T- SQL中的动态搜索条件.用于sql 2005和更早版本”中,Erland给出了如何在sp_executesql中使用动态sql的示例。
执行者
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中创建的临时表将无法从调用过程中访问,因为动态SQL退出时会删除这些表。
因此,我的问题围绕着这个问题:如果您已经构建了一次动态sql语句,并且@sql
中的SELECT语句返回了col1、col2、col3、col4等,那么如果您必须以不同的方式重新查询相同的结果集,您应该怎么办?例如,如果您必须返回另一个具有计数并按col1分组的结果集,以及由col2分组的另一个结果集,或者其他一些以原始@sql
的结果集为基础的标准?
您是否需要为每个不同的场景重新构建@sql,从而最终得到@sql、@sql_2、@sql_3、.?
在这种情况下,动态sql仍然是最好的选择吗?还是最好使用插入到#temp表中的静态sql,以便重新查询#temp表的结果?
发布于 2011-02-06 01:49:14
好的,下面是msdn站点围绕这个问题提供的一个解决方案的示例。
http://social.msdn.microsoft.com/Forums/en/sqlreportingservices/thread/3ed6885a-fe18-41c0-bce4-76c44c737a1b
问题是:如果创建临时表,并且在动态sql中创建临时表,则没有机会访问动态sql之外的临时表。但是,如果首先在动态之外创建临时表,然后在动态sql中填充临时表,则可以访问动态sql之外填充的临时表。
发布于 2011-02-06 20:36:55
另一种方法是使用INSERT ... EXEC
设备,尽管它的使用范围比您自己的查找方式更有限。
INSERT INTO sometable /* or @vartable or #temptable */
EXEC sp_executesql @sql /* and @params, if needed */
您不能在另一个INSERT...EXEC
中调用的SP中使用它。
发布于 2021-05-21 20:47:59
在Server中,如果在动态SQL中创建临时表,则无法从调用过程中的非动态SQL访问该临时表。就像你说的。
你有几个选择:
https://stackoverflow.com/questions/4910896
复制相似问题