#sql #sql-server-2005 #tsql #stored-procedures #ddl
#sql #sql-server-2005 #tsql #хранимые процедуры #ddl
Вопрос:
Я хочу создать временную хранимую процедуру для создания нескольких представлений; поэтому что-то вроде этого:
create proc #t1 as
begin
create view v1 as select 1 as x
go
create view v2 as select 2 as x
end
К сожалению, когда я выполняю это в Microsoft SQL Server 2005, я получаю синтаксическую ошибку в первой create view
строке.
Работает что-то вроде этого:
create proc #t1 as
begin
exec('create view v1 as select 1 as x')
exec('create view v2 as select 2 as x')
end
Однако это кажется ужасным способом делать то, что я хочу.
Итак, что не так с первой попыткой и каков наилучший способ создать несколько представлений в хранимой процедуре?
Комментарии:
1. Почему вы хотите создать что-то вроде представления внутри хранимой процедуры?? Представление является частью вашей базы данных — оно должно быть создано с помощью других ваших инструкций DML….
2. «это кажется ужасным способом делать то, что я хочу» — я согласен (для обеих форм). Возможно, если вы можете рассказать нам, чего вы пытаетесь достичь в качестве общей цели, мы сможем предложить решение. Как говорит marc_s, обычно представления не создаются как часть хранимой процедуры.
3. Я не могу вспомнить ни одного случая, когда создание представления в сохраненной процедуре было бы полезным.
4. @HLGEM, @Damien, @marc: Мне нужно создать и инициализировать базу данных из приложения Java. У меня есть SQL-скрипт, который выполняет инициализацию, но я не могу выполнить скрипт через JDBC, если не разберу его на отдельные инструкции; есть библиотеки, которые могут это делать. Существуют также инструменты командной строки, которые я могу использовать для выполнения произвольного SQL-скрипта. Я изучал другой вариант, который заключается в том, чтобы обернуть весь скрипт в одну временную процедуру. Скрипт, конечно, содержит GO, следовательно, этот последний подход не сработал бы.
Ответ №1:
Вы не можете иметь go
внутри хранимой процедуры. Это не команда в SQL, это разделитель между пакетами в диспетчере SQL, поэтому он разделит процедуру на два пакета и вызовет синтаксические ошибки, поскольку ни один из пакетов не является полной командой.
Ответ №2:
Вам не нужно писать полноценный анализатор, чтобы это работало — все, что вам нужно делать, это то, что делают инструменты командной строки / SSMS — считывать строки из файла и накапливать их в a (в .Net это stringbuilder, не могу вспомнить эквивалент в Java), пока вы не встретите строку, начинающуюся со слова GO
. Каждый раз, когда вы достигаете этой точки, отправляйте накопленный буфер на SQL Server, а затем очищайте буфер и начинайте заново.
Пока ваш текущий скрипт имеет GO
всякий раз, когда это требуется, вышеуказанное должно работать.
Комментарии:
1. Как вы отправляете, очищаете и затем запускаете снова?
Ответ №3:
Это легко, вы можете достичь этого с помощью переменной, присвоив create view операторам @variable, а затем EXEC (@Variable) внутри процедуры