2011-02-06 76 views
0

第2部分:在他的文章「T-SQL中的動態搜索條件... for SQL 2005及更早版本」中,Erland Sommarskog給出了一個如何通過sp_executesql使用動態sql。動態SQL,sp_executesql和重建動態sql語句 - 第2部分

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 

等等

在另一個article上dyanmic SQL中,他寫道:在動態SQL創建

臨時表不會從調用訪問過程,因爲它們在動態SQL退出時被刪除。

所以我的問題都是圍繞着這個問題:如果你已經建立了動態​​SQL語句 一次,並在@sql回報COL1,COL2,COL3,COL4 SELECT語句等, 你應該怎麼如果您必須以不同的方式重新查詢相同的結果集,請執行操作嗎?例如,如果必須返回另一個具有COUNT且按col1, 和另一個結果集(按col2分組的COUNT結果集)的結果集,或者返回基於從原始@sql開始的結果集的其他結果集?

您是否必須重新爲每種不同場景重新構建@sql, 因此您最終會得到@sql,@ sql_2,@ sql_3,...?

在這種情況下,動態sql仍然是最好的選擇,否則會更好地使用靜態sql插入到#temp表中,這樣你可以 重新查詢#temp表結果嗎?

回答

0

好吧,下面是msdn網站圍繞此問題提供的一個解決方案示例。

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

的問題是這樣的:如果你創建臨時表,並在創建臨時表內,您的動態SQL,你就沒有機會訪問動態sql的臨時表之外。 但是,如果你第一個創建你的臨時表在動態sql的外部,然後填充臨時表INSIDE動態sql,你可以訪問動態sql的填充臨時表OUTSIDE。

+0

這不是因爲使用CREATE語句,但由於是動態SQL – 2011-02-06 01:56:02

0

另一種方式來做到這一點,但在使用中比你自己找到更多的限制,將使用INSERT ... EXEC設備。

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

你不能在另一個INSERT...EXEC中調用本身的SP中使用它。