Использовать хранимую процедуру как функцию

#sql #sql-server #dynamic-sql

#sql #sql-сервер #динамический-sql

Вопрос:

Мне нужно иметь дело с именем таблицы как с переменной.Тогда я должен использовать динамический sql и, следовательно, я должен использовать хранимую процедуру. Но проблема в том, как я могу использовать хранимую процедуру как пользовательскую функцию sql.

например: выберите col1,(Exec sp1 param1,’tbName’) из table1

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

1. Вы не можете. Единственный способ использовать хранимую процедуру аналогичным образом — это использовать соединение с циклической поддержкой, но тогда вам нужно будет использовать динамический SQL для передачи параметра хранимой процедуре, что не улучшит ситуацию!

2. Вам вообще «не нужно»: возможно, вам следует представить нам общую картину, чтобы мы могли предложить решения…

3. OP сказал: I need to deal with the table name as a variable , я говорю: это, скорее всего, результат проблемы проектирования. вы можете использовать свои плоскогубцы как молоток, это может немного сработать, но это не то, для чего они были разработаны. Вместо этого используйте hammer.

Ответ №1:

Наконец, я изменил свой дизайн и использую динамический SQL на одном верхнем уровне.

Ответ №2:

Это будет возможно в sql server denali, который вводит новые ключевые слова «WITH RESULTSET».

Альтернативой в текущих версиях sql является передача временной таблицы хранимой процедуре

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

1. Я полагаю, что это скалярный результат, а не набор результатов, за которым следует операция. Они должны использовать SP, потому что им нужно передать имя таблицы в качестве параметра, а это подразумевает динамический сценарий, который, в свою очередь, подразумевает, что функция не может быть использована (иначе этот вопрос не существовал бы).

Ответ №3:

Хранимые процедуры могут возвращать скалярные значения через выходные параметры. Вот пример (из здесь).

Создайте хранимую процедуру следующим образом:

 CREATE PROCEDURE _4P_test 
    @intInput INT,
    @intOutput INT OUTPUT
AS
    SET @intOutput = @intInput   1 
  

Вызовите ее следующим образом:

 DECLARE @intResult INT

EXEC _4P_test 3, @intResult OUT

SELECT @intResult
  

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