#sql #tsql #sql-server-2008
#sql #tsql #sql-server-2008
Вопрос:
Я хочу добавить файл / группу файлов в существующую базу данных, но мне нужно получить путь из переменной, потому что он будет другим, когда этот сценарий будет завершен. Когда я проверяю скрипт в SQL Management Studio 2008 R2, он возвращает ошибку в FILENAME = @Path
.
Как я могу использовать эту переменную?
СКРИПТ НЕ БУДЕТ ЗАПУЩЕН Из КОМАНДНОЙ СТРОКИ!
ALTER DATABASE [MyDB]
ADD FILEGROUP [MyDB_FileStream] CONTAINS FILESTREAM
GO
DECLARE @Path VARCHAR(MAX)
SET @Path = 'C:whatEverIWantItToBeThisCouldChangeWithLogicYouGetThePoint'
ALTER DATABASE [MyDB]
ADD FILE
(NAME = 'MyDB_FileStream'
, FILENAME = @Path
)
TO FILEGROUP [MyDB_FileStream]
Ответ №1:
Использование динамического SQL:
Declare @Path nvarchar(max)
Declare @Sql nvarchar(max)
Set @Path = 'C:whatEverIWantItToBeThisCouldChangeWithLogicYouGetThePoint'
Set @Sql = 'Alter Database [MyDb]
Add File( Name = ''MyDb_FileStream''
, FileName = ' QuoteName( @Path, '''' )
') To FileGroup [MyDbFileStream]'
Exec( @Sql )
Комментарии:
1. БОЛЬШОЕ СПАСИБО!!! Я всегда ненавидел динамический SQL, потому что мне казалось, что он «избегает» проверки синтаксического анализа на наличие ошибок… но, возможно, у этого есть свое применение
2. Просто убедитесь, что @Path поступает из надежного источника, а не из маленьких таблиц Bobby xkcd.com/327
3. @SqlACID — Что вы могли бы передать в переменную @Path, что вызвало бы выполнение инструкции, которую вы не хотели? Проблема возникнет при попытке выполнить сохраненную процедуру (предположительно, поскольку мы используем переменную) со стороны клиента, а не из самой процедуры. Предполагая, что вызов сохраненного вызова proc параметризован, что может быть передано в @Path, что не было бы экранировано или ошибка?
Ответ №2:
Не уверен, что это сработает для вас, но если вы собираетесь запустить скрипт из командной строки, вы могли бы сделать:
ALTER DATABASE [MyDB]
ADD FILE (NAME = 'MyDB_FileStream', FILENAME = $(path))
TO FILEGROUP [MyDB_FileStream]
И запустите его с:
sqlcmd -s servername -i script.sql -v path="path to the file"
Ответ №3:
Я не пробовал, но обычно динамический sql может помочь решить проблему такого рода