При желании использовать UNION из другой таблицы в T-SQL без использования временных таблиц или динамического SQL? - PullRequest
2 голосов
/ 11 августа 2009

У меня есть две серверные таблицы sql с одинаковой структурой. В хранимой процедуре у меня есть выбор из первой таблицы. Иногда я хочу выбрать из второй таблицы также на основе переданного параметра.

Я хотел бы сделать это, не прибегая к использованию динамических sql или временных таблиц.

Ответы [ 5 ]

6 голосов
/ 11 августа 2009

Передайте параметр = 1 для объединения, что-нибудь еще, чтобы вернуть только первый набор результатов:

select field1, field2, ... from table1 where cond
union
select field1, field2, ... from table2 where cond AND param = 1
2 голосов
/ 11 августа 2009

Если они оба имеют одинаковую структуру, то почему бы не иметь одну таблицу с параметром, который различает две таблицы? В этот момент все становится простым делом в регистре для параметра, для которого вы получаете набор результатов.

Второй альтернативой являются двойные наборы результатов. Вы можете выбрать несколько наборов результатов из хранимой процедуры. Затем в коде вы либо используете 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")
1 голос
/ 11 августа 2009

Это довольно легко.

/* 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 для строки, оно возвращается, в противном случае оно отбрасывается.

Значение всегда равно true, поэтому возвращается каждая строка.

select * 
from tableX
where 1 = 1

Это всегда имеет значение false, поэтому строки не возвращаются (иногда используется как быстрый и грязный запрос get-me-the-columns).

select * 
from tableX
where 1 = 0
0 голосов
/ 11 августа 2009

Используйте представление.

CREATE view_both КАК SELECT *, 1 AS источник ИЗ таблицы 1 СОЮЗ ВСЕХ SELECT *, 2 AS источник ИЗ таблицы2

SELECT * FROM view_both WHERE source <@ source_flag </p>

Оптимизатор определяет, какие или обе таблицы использовать, основываясь на источнике, не требуя его индексации.

0 голосов
/ 11 августа 2009

это вернет значения из любой таблицы, в зависимости от того, передали ли вы значение параметра

select field1, field2, ... from table1 where @p1 is null
union
select field1, field2, ... from table2 where @p1 is not null

вам просто нужно добавить остальные критерии для предложения where

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...