Хранимая процедура, передайте имя таблицы в качестве параметра - PullRequest
2 голосов
/ 27 июля 2010

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

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

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

Например:

SELECT * FROM @MyTable WHERE...

Если это так, как мне установить переменную @MyTable из имени таблицы?

Я использую SQL Server 2005.

Ответы [ 5 ]

3 голосов
/ 27 июля 2010

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

Выбор из TableA отличается от выбора из TableB, даже если операторы выбора выглядят одинаково. Могут быть разные индексы, разные размеры таблиц, распределение данных и т. Д.

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

Я написал такие генераторы на T-SQL, но вы можете легко сделать это с большинством языков программирования. Это довольно простые вещи.

Просто добавьте еще одну вещь, так как Скотт E создал ORM ... вы также сможете использовать эти хранимые процедуры с самыми сложными ORM.

1 голос
/ 27 июля 2010

Вы можете использовать динамический Sql, но убедитесь, что объект существует первым, если вы не можете на 100% доверять источнику этого параметра. Вероятно, произойдет снижение производительности, поскольку сервер SQL не сможет повторно использовать один и тот же план выполнения для разных параметров.

IF OBJECT_ID(@tablename, N'U') IS NOT NULL
BEGIN 
    --dynamic sql
END
1 голос
/ 27 июля 2010
EXEC(N'SELECT * from ' + @MyTable + N' WHERE ...     ')
1 голос
/ 27 июля 2010

Вы должны использовать динамический sql. Но не делай этого! Вам лучше использовать ORM.

0 голосов
/ 03 февраля 2015
ALTER procedure [dbo].[test](@table_name varchar(max))
 AS
 BEGIN
  declare @tablename varchar(max)=@table_name;
  declare @statement varchar(max);
  set @statement = 'Select * from ' + @tablename;
  execute (@statement);
 END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...