Лучший отвечающий
Однотипные хранимые процедуры для множества таблиц... (SQL server). Дублировать процедуры с разными названиями таблиц или передавать таблицу в параметрах?

Вопрос
-
ДОБРОГО ВРЕМЕНИ СУТОК!У меня есть несколько таблиц. Хранимые процедуры для них есть общие (такие как добавить одну строчку, удалить, и т.п.). Код процедуры для каждой из таблиц получается одинаковым, за исключением фразы "... FROM *** ....".В голове два выхода:
- Дублировать "хранимки" для каждой из таблиц, заменяя в них название таблицы
- Создать обобщенные процедуры и в параметрах как-то указывать таблицу
Полагаю, что второй вариант правильнее, однако попытки успехом не увенчались.Проблема в том что нельзя просто в параметрах принять varchar строку, к примеру, содержащую название таблицы, тем самым заменив код:ALTER PROC [dbo].[TeachersDeleteSome] @Index INT AS DELETE FROM Teachers WHERE ID = @Index;
на:ALTER PROC [dbo].[TeachersDeleteSome] @Index INT @TableName VARCHAR(50) AS DELETE FROM @TableName WHERE ID = @Index;
При такой реализации будет ошибка :Сообщение 1087, уровень 15, состояние 2, процедура TeachersDeleteSome, строка 5Необходимо объявить табличную переменную "@TableName".
Следуя совету, данному мне компилятором, написал следующее:ALTER PROC TeachersDeleteSome @Index INT, @TableName TABLE AS DELETE FROM @TableName WHERE ID = @Index;
Ошибки:- Сообщение 156, уровень 15, состояние 1, процедура TeachersDeleteSome, строка 3 Неправильный синтаксис около ключевого слова "TABLE".
- Сообщение 1087, уровень 15, состояние 2, процедура TeachersDeleteSome, строка 5 Необходимо объявить табличную переменную "@TableName".
Может нужно в DECLARE создавать табличную переменную, а потом ей присваивать что то.Вопрос: Следует ли модифицировать хранимые процедуры в универсальные для множества таблиц, либо же мне просто копировать процедуры?И, если всё-таки стоит модифицировать процедуры, то как правильно пользоваться табличными переменными?СПАСИБО!- Изменено Shoshin Sergey 6 января 2012 г. 11:45 Очередное форматирование
6 января 2012 г. 11:39
Ответы
-
exec (@str)
But this is not a good idea. I suggest to create an SP for every table rather than using dynamic SQL.
For every expert, there is an equal and opposite expert. - Becker's Law
My blog- Помечено в качестве ответа Shoshin Sergey 8 января 2012 г. 8:29
8 января 2012 г. 3:58
Все ответы
-
вам нужно использовать динамику, для реализации работы с таблицами в качестве параметра:
в теле процедуры используйте код
declare @str varchar(1024) set @str = ' DELETE FROM '+ @TableName + ' WHERE ID = ' + convert( varchar, @Index ) exec @str
http://www.t-sql.ru7 января 2012 г. 11:15Модератор -
exec (@str)
But this is not a good idea. I suggest to create an SP for every table rather than using dynamic SQL.
For every expert, there is an equal and opposite expert. - Becker's Law
My blog- Помечено в качестве ответа Shoshin Sergey 8 января 2012 г. 8:29
8 января 2012 г. 3:58