2009-06-12 2 views
1

У меня есть хранимая в SQL Server 2005 процедура, которая возвращает два набора результатов, которые различаются в схеме.захват первого набора результатов из хранимой процедуры, вызванной из другой хранимой процедуры

Другая хранимая proc выполняет ее как Insert-Exec. Однако мне нужно вставить первый набор результатов, а не последний. Каков способ сделать это?

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

+0

Возможный дубликат [Доступ к наборам результатов из хранимых процедур Transact-SQL SQL Server] (https://stackoverflow.com/questions/58940/access-to-result-sets-from-within-stored-procedures- transact-sql-sql-server) –

ответ

3

На самом деле INSERT..EXEC попытается вставить BOTH-данные в таблицу. Если столбец соответствует совпадению и тип данных может быть неявно преобразован, тогда вы фактически получите оба.

В противном случае он всегда будет терпеть неудачу, потому что нет возможности получить только один из результатов.

Решение этой проблемы состоит в том, чтобы извлечь функциональность, которую вы хотите от вызванной процедуры, и включить ее в процедуру вызова (ранее). И напомните себе, что «SQL не похож на клиентский код: избыточный код более приемлем, чем избыточные данные».

В случае, если это не было ясно, выше, позвольте мне разграничить факты и варианты, доступные для тех, кто в этой ситуации:

1) Если два набора результатов, возвращаемые совместимы, то вы можете получить как в одной таблице с INSERT и попытаться удалить те, которые вы не хотите.

2) Если два набора результатов несовместимы, то INSERT..EXEC нельзя заставить работать.

3) Вы можете скопировать код из вызываемой процедуры и повторно использовать его в вызывающем абоненте, а также оплатить стоимость ремонта с двойным редактированием.

4) Вы можете изменить вызванную процедуру для более совместимой работы с другими процедурами.

Thats it. Это ваш выбор в T-SQL для этой ситуации. Есть некоторые дополнительные трюки, которые вы можете играть с SQLCLR или клиентским кодом, но они будут включать в себя немного по-другому.

+0

Я знаю об этом и, как я уже сказал, у двух наборов результатов есть схемы. Таким образом, нет, оба не могут быть вставлены в одну и ту же таблицу. Мне нужно сделать это так, как я объяснил, чтобы, если кто-то изменил первый процесс, второй proc автоматически получает правильные данные, возвращенные первым proc. Копирование sql не является хорошей идеей, потому что тогда разработчик должен модифицировать и то же самое, и разработчики пропустят зависимость. Это не избыточный случай данных. Это избыточный код, который плохой. – Abdu

+0

(коррекция) .... два набора результатов имеют разные схемы. – Abdu

+0

Пожалуйста, перечитайте мой ответ, все, что вы поднимаете, покрывается там: 1) вы не можете получить только один из наборов, 2) они должны быть той же схемой, чтобы получить оба; 3) нет никакого способа обойти это , 4) ваша лучшая альтернатива - скопировать код. Единственная альтернатива заключается в том, чтобы изменить вызываемую процедуру на более совместимую. Это вы только выбор. Прошу прощения, но так работает SQL. – RBarryYoung

0

Есть ли веская причина, по которой вы не можете просто вернуть первый sproc только один результирующий набор? Как правило, вам, вероятно, следует избегать того, чтобы один sproc выполнял как INSERT, так и SELECT (исключение - если SELECT должен получить идентификатор вновь созданной строки).

+0

Первый sproc - уже существующий и уже выпущенный. Что касается вашего правила, о котором вы упомянули, нет ничего плохого в том, что sproc делает все, что ему нужно для выполнения своей работы. Множественные вставки и выделения в одном sproc очень распространены. Вы не объяснили, каковы недостатки. – Abdu

0

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

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

+0

Оригинал proc не может и не должен быть изменен для этой цели. Это сложный вопрос, и его нельзя трогать только потому, что другой процессор хочет получить те же данные. Причина, по которой я не хотел копировать код, потому что он длиной в милю, и это будет очень удобно, если я могу просто назвать это в моей программе в одном заявлении. Во всяком случае, я должен придумать решение, которое повторно использует его, не изменяя его. – Abdu

Смежные вопросы