Динамический SQL опасен. Вы никогда не хотите подставлять переданные значения непосредственно в строку SQL. К счастью, это звучит так, как будто вы уже это знаете.
К сожалению, в этом случае вы обнаружили проблему, состоящую в том, что вы не можете использовать параметр SQL для имени таблицы. Так что делать? Вы не хотите использовать переданное значение в динамически генерируемом SQL, но не можете поместить его в запрос обычным безопасным способом.
Ответ - справочная таблица. Создайте таблицу «таблиц», которая содержит имя каждой из ваших конкретных таблиц. Это должно выглядеть примерно так:
CREATE TABLE [tables] (table_name sysname)
Затем вы можете написать запрос, который будет выглядеть примерно так:
SELECT @tblSpecific = table_name FROM [tables] WHERE table_name = @tblSpecific
Теперь вам просто нужно проверить, является ли @tblSpecific
1014 *. Если это не так, тогда безопасно использовать в динамическом операторе SQL (и динамический SQL здесь, в конечном итоге, является вашим единственным вариантом: даже определенная пользователем функция делает это на каком-то уровне).
Да, и еще одна вещь - мой выбор имен и типов для таблицы поиска не случаен. В стандарте SQL уже есть такая таблица (ну, в любом случае, представление). Просто используйте INFORMATION_SCHEMA.Tables
.