#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 описанным вами способом.