它看起來像通過EXECUTE字符串方法使用動態SQL創建的#temptables具有不同的作用域,並且不能在同一存儲過程中被「固定」SQL引用。 但是,我可以引用動態SQL語句在子序列動態SQL中創建的臨時表,但似乎存儲過程不會將查詢結果返回給調用客戶端,除非SQL已修復。T-SQL動態SQL和臨時表
一個簡單的2表方案: 我有2個表。我們稱之爲訂單和項目。 Order具有OrderId的主鍵,Items具有ItemId的主鍵。 Items.OrderId是標識父訂單的外鍵。一個訂單可以有1到n個項目。
我希望能夠爲用戶提供一個非常靈活的「查詢生成器」類型界面,以允許用戶選擇他想查看的項目。過濾條件可以基於Items表和/或Parent Order表中的字段。如果一個項目滿足包含父項目的條件的條件(如果存在),則該項目應該返回查詢以及父項目。
通常,我想大多數人會在Item表和父Order表之間構造一個連接。我想改爲執行2個單獨的查詢。一個返回所有合格項目,另一個返回所有不同的父訂單。原因有兩點,你可能會也可能不會同意。
第一個原因是我需要查詢父Order表中的所有列,並且如果我做了單個查詢以將Orders表連接到Items表,我將多次重新編制Order信息。由於每個訂單通常有大量的項目,我想避免這種情況,因爲這會導致更多的數據被轉移到胖客戶端。相反,如前所述,我想在數據集中分別返回兩個表,並使用其中的兩個表填充自定義Order和子項Items對象。 (我對LINQ或實體框架還不夠了解,我用手構建了我的對象)。第二個原因是我想返回兩個表而不是一個是因爲我已經有另一個過程返回給定OrderId的所有Items以及父Order,並且我想使用相同的2表方法,以便我可以重新使用客戶端代碼來填充返回的2個數據表中的自定義Order和Client對象。
我希望做的是這樣的:
建設上,通過對WinForm的創建自定義過濾器中指定其加入訂單表的項目表,每個表上適當的過濾器的客戶端動態SQL字符串胖客戶端應用程序。客戶端上的SQL構建看起來會是這樣的:
TempSQL = "
INSERT INTO #ItemsToQuery
OrderId, ItemsId
FROM
Orders, Items
WHERE
Orders.OrderID = Items.OrderId AND
/* Some unpredictable Order filters go here */
AND
/* Some unpredictable Items filters go here */
"
然後,我會調用存儲過程,
CREATE PROCEDURE GetItemsAndOrders(@tempSql as text)
Execute (@tempSQL) --to create the #ItemsToQuery table
SELECT * FROM Items WHERE Items.ItemId IN (SELECT ItemId FROM #ItemsToQuery)
SELECT * FROM Orders WHERE Orders.OrderId IN (SELECT DISTINCT OrderId FROM #ItemsToQuery)
這種方法的問題是,#ItemsToQuery表,因爲它是由動態SQL創建,無法從以下2個靜態SQL獲取,如果將靜態SQL更改爲動態,則不會將結果傳回胖客戶端。
3四處浮現在腦海中,但我是一個更好的看:
1)第一個SQL可以通過從客戶端執行動態構造SQL執行。然後結果可以作爲表格傳遞給上述存儲過程的修改版本。我熟悉將表格數據作爲XML傳遞。如果我這樣做了,那麼存儲過程可以使用靜態SQL將數據插入臨時表,因爲它是由動態SQL創建的,因此可以毫無問題地進行查詢。(我還可以調查到傳遞新的表型,而不是PARAM XML)。但是,我想,以避免傳遞了潛在的大名單,一個存儲過程。
2)我可以執行所有來自客戶端的查詢。
第一是這樣的:
SELECT Items.* FROM Orders, Items WHERE Order.OrderId = Items.OrderId AND (dynamic filter)
SELECT Orders.* FROM Orders, Items WHERE Order.OrderId = Items.OrderId AND (dynamic filter)
這仍然爲我提供了重用我的客戶面體羣的代碼,因爲訂單和項目繼續在兩個不同的表要返回的能力。
我有一種感覺,那我可能會用我的存儲過程中的表數據類型的一些選項,但是這也是新的給我,我將不勝感激勺子餵養的一點點在那一個。
如果您甚至遠遠在我寫掃描此,我很驚訝,但即便如此,我竟被dappreciate任何關於如何做到這一點最好你的看法。
TLDR:http://www.urbandictionary.com/define.php?term = TLDR – 2010-05-27 00:26:59