получение первого результирующего набора из сохраненного процесса, вызванного из другого сохраненного процесса - PullRequest
1 голос
/ 12 июня 2009

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

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

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

Ответы [ 3 ]

3 голосов
/ 12 июня 2009

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

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

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

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

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

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

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

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

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

0 голосов
/ 12 июня 2009

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

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

0 голосов
/ 12 июня 2009

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

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