Соединения хранимых процедур

#sql #sql-server #stored-procedures #sql-server-2008-r2 #integration

#sql #sql-сервер #хранимые процедуры #sql-server-2008-r2 #интеграция

Вопрос:

Я только что добавил временную таблицу в свою хранимую процедуру и пытаюсь соединить эту таблицу с другими полями в этой хранимой процедуре. Это изменение влияет на то, как будет выполняться мой пакет. Итак, процедура выполняется нормально, но мой пакет выдает ошибку «для удаления внешних столбцов» пример

 If object_id() is null
Begin
Create table #...
Insert into table #...
(
Value int
Name varchar
)

Select value from # where .....

End
  

Это работает нормально, но я думаю, что моя проблема связана с объединением, как показано ниже

 Select ab.value, * from
(

Select top 100
...
...
...
...

Case when this then this 
Else null
End as usage

From ...
Left join ...
On 
Left join..
On
Left join
On 

)cd

Left join #.. ab on
ab. =  cd.
  

Результат этого соединяет мою исходную хранимую процедуру (т.Е. Таблицу cd в скобках) с созданной временной таблицей и возвращает нулевые поля. Это не то, что я хочу. Правильное соединение также не работает. Могу ли я добавить это как оператор case?

Мне нужно только поле «значение» из временной таблицы в качестве поля в моем результате. И я хочу иметь возможность сопоставить это в моем пакете ssis.

Комментарии:

1. если ваше внешнее соединение возвращает все нули для таблицы ab, то оно не находит совпадающих записей. Вы уверены, что столбец, с которым вы сопоставляете, совпадает в AB и CD?

2. Они не совпадают. Я только хочу вернуть поле «значение» из временной таблицы в дополнение к другим полям.

3. Тогда я предполагаю, что временная таблица содержит одну строку? Тогда вы можете захотеть взглянуть на обычную переменную вместо временной таблицы. Вам нужно удалить часть соединения вашего соединения, и тогда оно вернет строку в AB для каждой строки в CD. ОДНАКО запросы декартовых произведений — ДЕЙСТВИТЕЛЬНО плохая практика, они съедают время процесса.

4. Пожалуйста, не могли бы вы объяснить подробнее …? Чтобы удалить левое соединение и создать обычную переменную вместо временной таблицы?

Ответ №1:

Вот как это должно быть сделано, если ваша временная таблица содержит одну строку

 declare @whatever varchar(10);
set @whatever = 'Foo'

select @whatever, A.* from table_A as A
  

Если ваша временная таблица содержит более одной строки, вы выполняете декартово произведение (оно сопоставляет каждую строку в таблице A со ВСЕМИ строками в таблице B. ЭТО ОЧЕНЬ ПЛОХАЯ ВЕЩЬ!

 Select * from table_A, table_B  (make no comparison statement)
  

если вы сделаете это, это убьет вашу систему. В качестве примера, я сделал это с двумя небольшими таблицами (439 и 193 строки), мой результирующий набор составлял более 47 000 записей! Это плохо, плохо, плохо.

Я упоминал, что это ужасная вещь?

Комментарии:

1. Спасибо. Я жестко закодировал данные, используя оператор case в исходной хранимой процедуре (. Я удалил временную таблицу и соединение), и все работало нормально.