Имя базы данных в скрипте .sql - PullRequest
1 голос
/ 05 июля 2011

Мне нужно выполнить следующую инструкцию

ALTER DATABASE DatabaseName ...

в моем скрипте .sql.Но я хочу сохранить свой сценарий нейтральным к конкретной базе данных.Поэтому я хочу, чтобы ALTER DATABASE работал с текущей базой данных.Я надеялся, что DatabaseName - необязательный параметр, но, согласно документации, это не так.

Ответы [ 5 ]

3 голосов
/ 05 июля 2011

Требуется имя базы данных, и вы даже не можете поместить его в параметр.

Но вместо этого вы можете использовать 'exec'

    declare @stmt varchar(max)
    set @stmt = 'alter database....'
    exec (@stmt)

Это не очень элегантно, но я считаю, что это единственный способ сделать это

1 голос
/ 05 июля 2011

db_name () возвращает текущую базу данных, которую затем можно вставить в оператор EXEC

DECLARE @dbname sysname = db_name()

EXEC('ALTER DATABASE ' + @dbname + ' SET SINGLE_USER WITH ROLLBACK IMMEDIATE') 
0 голосов
/ 05 июля 2011

Разве вы не можете просто использовать язык сценариев, чтобы обернуть этот вызов SQL? Было бы намного проще и чище.

Это можно сделать с помощью ряда замысловатых команд SQL. Если вы используете MySQL, пример создания собственного оператора SQL с использованием переменных и CONCAT показан здесь:

http://blog.mclaughlinsoftware.com/2011/01/19/prepared-statement-failure/

Как сказано в статье, для операторов ALTER вы должны ОБЪЕДИНИТЬ имя базы данных в переменную оператора. Затем вы можете использовать другие команды SQL для получения нужного имени базы данных, например DATABASE ().

0 голосов
/ 05 июля 2011

Ну

Это одна из причин, почему так много ORM появилось почти для всех возможных языков. Чтобы быть уверенным, что вы предлагаете как можно большую независимость от БД, я рекомендую вам использовать один из них.

0 голосов
/ 05 июля 2011

РЕДАКТИРОВАТЬ: я отвлекаю свой ответ, ответы с использованием EXEC являются правильной идеей в этом случае.

Некоторое время это не нужно, но я считаю, что вы можете использовать SELECT db_name () в качестве подзапроса, например:

ALTER DATABASE (SELECT db_name()) ...

Для запуска соответствующей команды в текущей базе данных, если это работает для вашего варианта использования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...