首页 文章

动态SQL,sp_executesql和重建动态sql语句 - 第2部分

提问于
浏览
0

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 回答

  • 0

    好的,所以这里是msdn网站解决这个问题的一个例子 .

    http://social.msdn.microsoft.com/Forums/en/sqlreportingservices/thread/3ed6885a-fe18-41c0-bce4-76c44c737a1b

    问题是:如果你创建临时表,并在动态sql中创建临时表,则无法访问动态sql的临时表OUTSIDE . 但是,如果你创建你的临时表OUTSIDE的动态sql,那么在动态sql中填充临时表INSIDE,就可以访问动态sql的填充临时表OUTSIDE了 .

  • 0

    另一种方法是使用 INSERT ... EXEC 设备,虽然使用比您自己的查找更有限 .

    INSERT INTO sometable    /* or @vartable or #temptable */
    EXEC sp_executesql @sql  /* and @params, if needed */
    

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

相关问题