我有兩個具有相同結構的sql服務器表。在存儲過程中,我從第一個表中選擇一個。有時候我想從第二個表中選擇以及根據傳入的參數。(可選)使用T-SQL中另一個表的UNION,而不使用臨時表或動態SQL?
我想要一個方法來做到這一點,而不訴諸使用動態SQL或臨時表。
我有兩個具有相同結構的sql服務器表。在存儲過程中,我從第一個表中選擇一個。有時候我想從第二個表中選擇以及根據傳入的參數。(可選)使用T-SQL中另一個表的UNION,而不使用臨時表或動態SQL?
我想要一個方法來做到這一點,而不訴諸使用動態SQL或臨時表。
在參數傳遞= 1到工會,別的只返回的第一個結果集:
select field1, field2, ... from table1 where cond
union
select field1, field2, ... from table2 where cond AND param = 1
如果他們都是完全相同的結構,那麼爲什麼不能有一個參數區別於單個表兩張桌子?在這一點上,對於您收到的結果集的參數,它變成一個簡單的案例陳述。
第二個選擇是雙重結果集。您可以從存儲過程中選擇多個結果集。然後在代碼中,您可以使用DataReader.NextResult或DataSet.Tables(1)來獲取第二組數據。然後,將代碼的責任放在同一個集合中或合併兩個表。
第三種可能性是利用IF聲明。說,在通過一個整數與1,2,3預期可能的值,然後沿此在實際存儲的過程代碼東西
if @Param = 1 Then
Select From Table1
if @Param = 2 THEN
Select From Table2
if @Param = 3 Then
Select From Table1 Union Select From Table 2
第四種可能性是具有兩個不同的過程之一,其運行工會和一個沒有,然後使它的代碼的責任,以確定哪一個要調用基於該參數,如:
myCommandObject.CommandText = IIf(myParamVariable = true, "StoredProc1", StoredProc2")
第二個表格用於特殊情況,可能很大,因此不能將其與第一個表格合併。 客戶期望單個結果集,我計劃對其進行更改。我想在數據庫端處理這個問題。 Case語句處理很多情況。我正在查看是否可以使用Case, – 2009-08-11 18:50:36
..我不打算改變它.. – 2009-08-11 18:51:06
這很容易。
/* Always return tableX */
select colA, colB
from tableX
union
select colA, colB
from tableY
where @parameter = 'IncludeTableY' /* Will union with an empty set otherwise */
如果這不是立即顯而易見(通常不是),請考慮下面的示例。要記住的主要事情是,如果where子句對於某行的計算結果爲true,則會返回,否則將被丟棄。
這總是評估爲真,所以每一行都會返回。
select *
from tableX
where 1 = 1
這總是評估爲false,因此沒有行返回(有時用作快速和髒的get-me-the-column查詢)。
select *
from tableX
where 1 = 0
這無論從表中返回值,這取決於你的參數傳遞一個值上
select field1, field2, ... from table1 where @p1 is null
union
select field1, field2, ... from table2 where @p1 is not null
你只需要添加您的標準,其餘爲where子句
使用視圖。
CREATE view_both AS SELECT *,1 AS源 FROM表1 UNION ALL SELECT *,2 AS源 FROM table2中
SELECT * FROM view_both WHERE源< @source_flag
優化根據來源確定要使用哪一個或兩個表,而不要求索引它。
你打了我一分鐘...... +1 – 2009-08-11 18:45:00
當問題出現時,我實際上是在做那種查詢:) – chris 2009-08-11 19:07:30
太簡單了,但我無法想出它。謝謝。 – 2009-08-11 19:11:24