Приветствую всех! Предистория вопроса такова, нужно заставить CREATE PROCEDURE и DROP PROCEDURE брать имя из переменной.
др. словами есть контрукция:
if object_id ('my_proc') is not NULL DROP PROCEDURE my_proc
CREATE PROCEDURE my_proc
... бла бла бла
все работает, но неприятно тем, что при необходимости изменить имя процедуры, его надо будет переписать в 3х местах сразу (еще и в вызове потом тоже). А хотелось бы что-то типа:
declare @a sysname
set @a = 'my_proc'
if object_id (@a) is not NULL DROP PROCEDURE @a
CREATE PROCEDURE @a
... бла бла бла
но это не работает, drop и create не понимают что делать с @a наверно это логично...
Есть информация что в Оракле будет работать конструкция типа:
DEFINE a = "my_proc"
DROP PROCEDURE &a;
В MSSQL такого нет, точнее будет сказать я не нашел %) в связи с этим вопрос:
Есть ли аналог Ораклового DEFINE в MSSQL или другая возможность решить поставленную задачу?
Dumpy пишет: > все работает, но неприятно тем, что при необходимости изменить имя > процедуры, его надо будет переписать в 3х местах сразу (еще и в вызове
Используйте внешний препроцессор. Например M4.
Или от С/C++.
Здравствуйте, Dumpy, Вы писали:
D>В MSSQL такого нет, точнее будет сказать я не нашел %) в связи с этим вопрос: D>Есть ли аналог Ораклового DEFINE в MSSQL или другая возможность решить поставленную задачу?
sp_executesql к сожалению неудобно — процедура может быть изрядно здоровая и загонять всю ее в строку как то нехорошо, можно конечно таким образом сделать проверку и удаление процедуры а потом делать CREATE , но тогда всеравно имя придется писать в 2х местах т.е. что то типа
declare @a nvarchar (255)
set @a = N'MyProc'
if object_id (@a) is not NULL DROP PROCEDURE @a
begin
set @a = 'DROP PROCEDURE ' + @a
exec sp_executesql @a
end
create procedude MyProc
бла бла бла
и вот это самое "бла бла бла" божет быть довольно длинным и формировать из него строку чтобы потом sp_execuтнуть как о нехорошо...
возможео с sp_executesql можно будет както еще извернуться но я не смог пока придумать %(
Использовать внешний препроцессор я не могу — я тут не один, а остальной народ этого просто не поймет, можно конечно втихую все делать и во вне просто отдавать уже текст после препроцессина...
А sqlcmd и Setvar как я понял появились только c 2005 mssql server, я пока обречен работать с 2000 или я понял все неправильно?
Спасибо всем, кто поделился информацией буду теперь думать как поступить дальше %)
Здравствуйте, Dumpy, Вы писали:
D>А sqlcmd и Setvar как я понял появились только c 2005 mssql server, я пока обречен работать с 2000 или я понял все неправильно?
это вообще не sql server-ная фишка, а sqlcmd — клиентской тулзы. ты можешь использовать клиентский тулзы 2005-го сервера с 2000-м клиентом. ну или по крайней мере можешь попробовать спольщовать