none
Однотипные хранимые процедуры для множества таблиц... (SQL server). Дублировать процедуры с разными названиями таблиц или передавать таблицу в параметрах? RRS feed

  • Вопрос

  • ДОБРОГО ВРЕМЕНИ СУТОК!
    У меня есть несколько таблиц. Хранимые процедуры для них есть общие (такие как добавить одну строчку, удалить, и т.п.). Код процедуры для каждой из таблиц получается одинаковым, за исключением фразы "... FROM *** ....".
    В голове два выхода:
    1. Дублировать "хранимки" для каждой из таблиц, заменяя в них название таблицы
    2. Создать обобщенные процедуры и в параметрах как-то указывать таблицу
    Полагаю, что второй вариант правильнее, однако попытки успехом не увенчались.
    Проблема в том что нельзя просто в параметрах принять 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;

    Ошибки:
    1. Сообщение 156, уровень 15, состояние 1, процедура TeachersDeleteSome, строка 3 Неправильный синтаксис около ключевого слова "TABLE".
    2. Сообщение 1087, уровень 15, состояние 2, процедура TeachersDeleteSome, строка 5 Необходимо объявить табличную переменную "@TableName".
    Может нужно в DECLARE создавать табличную переменную, а потом ей присваивать что то. 
    Вопрос: Следует ли модифицировать хранимые процедуры в универсальные для множества таблиц, либо же мне просто копировать процедуры? 
    И, если всё-таки стоит модифицировать процедуры, то как правильно пользоваться табличными переменными?
    СПАСИБО!
    • Изменено Shoshin Sergey 6 января 2012 г. 11:45 Очередное форматирование
    6 января 2012 г. 11:39

Ответы

Все ответы

  • вам нужно использовать динамику, для реализации работы с таблицами в качестве параметра:

    в теле процедуры используйте код

    declare @str varchar(1024) 
    set @str = ' DELETE FROM '+ @TableName 
                 + ' WHERE ID = ' + convert( varchar, @Index )
    exec @str
    

     


    http://www.t-sql.ru
    7 января 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