2015-01-19 2 views
0

Простой сценарий. Сохраненная процедура sp_Task1 вызывает sp_Task2 и sp_Task2 имеет таблицу выходных темп. #Task2_Output. Я хочу, чтобы sp_Task1 принял #Task2_Output и совершил с ним дальнейшие транзакции.Как проверить таблицу вывода вызываемой хранимой процедуры?

Как я могу получить эти две вещи случаются:

1) Убедитесь, что sp_Task1 ждет, пока sp_Task2 не будет завершена, чтобы перейти к следующей строке кода.

2) Как проверить, что #Task2_Output был успешно создан с кодом в пределах sp_Task1.

+0

Какие dbms? (Реализации хранимых процедур слишком часто не совместимы с ANSI.) – jarlh

+0

@jarlh Просто для того, чтобы уточнить, как предполагал Whirl Mind, dbms был фактически SQL Server 2005. В следующий раз отметьте, что перед этим. – tarheel

ответ

0

Поскольку вы не упоминаете, какую СУБД, я предполагаю, что это SQL Server, поскольку такие ситуации обычно возникают там.

К вопросу 1:

В SQL Server 2005 для временной таблицы, чтобы быть доступным для вызывающей процедуры сохраняется, то, возможно, придется использовать ## Task2_Output (это верно, два хэшей), а не # Task2_Output, так как временные имена таблиц с двумя префиксами # являются временными глобальными временными таблицами, доступными для вызывающей процедуры, но уничтоженными после их последнего использования. Однако вам, возможно, придется искать конфликты имен имен, если имена таблиц не назначаются динамически.

К вопросу 2:

Get sp_Task2 вернуть код возврата, с RETURN заявление. Если создание таблицы преуспевает, скажем, Return 1. Если сбой создания таблицы (известный путем проверки @@ERROR сразу после утверждения), то, скажем, Return -99.

В sp_Task1, вызовите sp_Task2 как следующее:

Declare @MyRetCode_Recd_In_Task1 int 

EXECUTE @MyRetCode_Recd_In_Task1 = sp_Task2 (with calling parameters if any). 

Вызов хранимой процедуры с = StoredProcName код возврата мода, код возврата, возвращенный sp_Task2 принимается sp_Task1. Затем вы можете проверить код возврата в sp_Task1, чтобы узнать, все ли хорошо.

+0

неверный. для вызывающей хранимой процедуры будет доступна регулярная синтаксическая таблица хэша. – Jeremy

+0

@Jeremy только в том случае, если он был создан * через * вызывающую хранимую процедуру или какой-либо контекст выполнения, который вызвал * it *. Локальные таблицы #temp, созданные хранимой процедурой * вызываемой *, удаляются при завершении этой процедуры. Ответчик эффективен правильно, поскольку в 99% случаев, когда кто-то говорит, как указывает OP, «* имеет временную таблицу вывода *», они означают один * созданный * этой процедурой. – RBarryYoung

+0

yup. ты прав. не читал достаточно внимательно. Благодарю. – Jeremy

0

Принятый ответ неправильный.

К вопросу 1:

Убедитесь sp_Task1 ждет, пока sp_Task2 не будет завершена, чтобы перейти к следующей строке кода.

Вам нечего делать. Вызов хранимых процедур и функций не является асинхронным. Если у вас есть следующий внутри sp_Task1:

... other SQL commands 

EXEC sp_Task2; 

... more SQL commands 

затем «командует более SQL» не будет выполняться до sp_Task2; Завершает (успешно или из-за ошибки).

К вопросу 2:

Как проверить, что # Task2_Output был успешно создан из кода в sp_Task1

Как уже было сказано, местные временные таблицы (т.е. префикс = #) создано в подпроцессе перестанет существовать, как только этот подпроцесс (т.е. вызов sp_Task2) заканчивается. You может использовать глобальную временную таблицу (то есть префикс = ##), но затем sp_Task1 может быть вызван только одним сеансом/соединением за раз, иначе вы столкнетесь с конфликтом имен на ##Task2_Output. Но этого легко избежать, просто создав локальную таблицу temp в sp_Task1. Имя этой временной таблицы должно быть известно, поскольку оно будет доступно в sp_Task1 после завершения sp_Task2. Поэтому нет причин не создавать его в первую очередь:

CREATE TABLE #Task2_Output (columns...); 

... other SQL commands 

EXEC sp_Task2; 

... more SQL commands 

SELECT ... 
FROM #Task2_Output; 

И тогда вам не нужно все равно проверять.


Дополнительно:

  • Если вы хотите проверить существование временной таблицы, используйте следующую команду:

    IF (OBJECT_ID(N'tempdb..#Task2_Output') IS NOT NULL) 
    BEGIN 
        -- non-NULL value from OBJECT_ID() means the table exists 
        ..do something; 
    END; 
    
  • Вы действительно, действительно должен не имена хранимых процедур префикса: sp_. Этот префикс зарезервирован для системных процессов и обрабатывается SQL Server как особый случай. Сначала он проверит этот процесс в базе данных [master], а затем в локальной или указанной базе данных. Следовательно, это ненужный удар производительности.

  • Вместо использования @@ERROR, используя структуру TRY/CATCH, намного эффективнее.

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