Как создать хранимую процедуру с динамическим предложением from - PullRequest
0 голосов
/ 07 января 2009

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

Для новых записей я хочу видеть только текущих людей. Если я обновляю существующую запись, я могу захотеть увидеть всех людей, поскольку существующая запись может ссылаться на кого-то, кто больше не является текущим.

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

Я уже пробовал добавить:

@view varchar(50)

select a, b from @view

Но я получаю сообщение о том, что должен объявить переменную @ view.

Это вообще возможно сделать?

Ответы [ 7 ]

2 голосов
/ 07 января 2009

Вы можете создать свое заявление в ИП и позвонить:

exec sp_executesql @sql
2 голосов
/ 07 января 2009

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

@useFirstView bit

IF @useFirstView = 1 
   -- select from firstView
ELSE
   -- select from secondView
1 голос
/ 01 октября 2009

Мне было интересно о том же самом, и я наткнулся на эту тему на форумах MSDN:

http://social.msdn.microsoft.com/Forums/en-US/transactsql/thread/fa523f21-5a8b-421f-99ce-9bb2ec30e848

В конце взгляните на ответ Сами Самира - по крайней мере, для меня он обеспечил идеальное решение, и я надеюсь, что он сделает то же самое для вас.

Динамический SQL для динамического выбора между фиксированным количеством таблиц / представлений, которые имеют одинаковые поля, просто не звучит правильно - сложно отлаживать и подвержено ошибкам / взломам.

Всего наилучшего.

0 голосов
/ 07 января 2009

Ваша идея заманчива, но она НЕ ПОДДЕРЖИВАЕТСЯ (почему люди здесь даже предлагают ОБЪЯВИТЬ переменную?) Или, другими словами, вы делаете это неправильно.

Предложение FROM принимает либо имя таблицы / представления / функции (жестко закодировано, а не из переменной varchar), либо переменную таблицы. Табличная переменная выглядит так:

DECLARE @table TABLE (a int, b int).

Обратите внимание, что это тип TABLE, а не VARCHAR. После этого вы можете сделать:

SELECT a,b FROM @table.

Но, очевидно, это не то, что вы хотите. Я бы предложил использовать sp_executesql (только если вы задаете имена представлений / таблиц, не исходя из пользовательских данных и т. П.) Или оператор IF-ELSE.

0 голосов
/ 07 января 2009

Вы просто пропустите объявление вашей переменной

DECLARE @view VARCHAR(50)
SET @view = 'myView'
SELECT a,b FROM @view

или если используется в хранимой процедуре

CREATE PROCEDURE SelectFromView
{
    @view VARCHAR(50)
}
AS
BEGIN

    DECLARE @sqlCommand varchar(1000)
    SET @sqlCommand = 'SELECT a, b from FROM ' + @view
    EXEC (@sqlCommand)

END

Остерегайтесь SQLInjection, как упоминалось ранее.

[править] Исправлено использование динамического создания sql с кодом от Nathan Koop, thx. [/ Править]

0 голосов
/ 07 января 2009

Вы пытались объявить переменную в хранимой процедуре и назначить параметр в качестве его значения?

Например, если у вас есть параметр с именем @view:

объявить @viewName nvarchar (50)

set @viewName = @ view

0 голосов
/ 07 января 2009

Вы можете использовать динамический SQL для решения вашей проблемы.

DECLARE @sqlCommand varchar(1000)
SET @sqlCommand = 'SELECT a, b from FROM ' + @view
EXEC (@sqlCommand)

Но я не думаю, что это лучшее решение. Вы, вероятно, должны иметь запрос типа

If @IsActiveFlag = TRUE THEN
  SELECT * FROM People WHERE IsActive = 1
ELSE
  SELECT * FROM People
ENDIF
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...