首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >动态SQL、sp_executesql和重新构建动态sql语句-第2部分

动态SQL、sp_executesql和重新构建动态sql语句-第2部分
EN

Stack Overflow用户
提问于 2011-02-06 01:21:24
回答 3查看 538关注 0票数 0

第2部分:在他的文章“T- SQL中的动态搜索条件.用于sql 2005和更早版本”中,Erland给出了如何在sp_executesql中使用动态sql的示例。

执行者

代码语言:javascript
运行
复制
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表的结果?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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之外填充的临时表。

票数 1
EN

Stack Overflow用户

发布于 2011-02-06 20:36:55

另一种方法是使用INSERT ... EXEC设备,尽管它的使用范围比您自己的查找方式更有限。

代码语言:javascript
运行
复制
INSERT INTO sometable    /* or @vartable or #temptable */
EXEC sp_executesql @sql  /* and @params, if needed */

您不能在另一个INSERT...EXEC中调用的SP中使用它。

票数 0
EN

Stack Overflow用户

发布于 2021-05-21 20:47:59

在Server中,如果在动态SQL中创建临时表,则无法从调用过程中的非动态SQL访问该临时表。就像你说的。

你有几个选择:

  • 预先创建临时表(在非动态sql中)。然后,它可以从动态sql中使用,这样您就可以插入到其中。
  • 如果您不知道临时表结构,那么前面的选项似乎就没那么有用了。但是,您可以首先使用单个虚拟列创建临时表,然后从动态sql修改临时表的结构。看上去有点恶心,但有时很方便。
  • 使用##全局临时表
  • 使用真正的表,可能带有一个“批处理”标识符来将您的结果与其他人的结果分离开来,而其他人也会插入到实际的表中。
  • 使用动态SQL创建/更改创建临时表的过程。然后,可以从非动态SQL调用该过程。相当多的工作,但有时很方便。
  • 按照您在问题中的建议,以不同的方式重新构建动态sql,并分别执行它们。不像您多次处理数据那样表现出色,但这通常并不重要。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4910896

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档