ИЗМЕНИТЬ БАЗУ ДАННЫХ / ДОБАВИТЬ ФАЙЛ / ПЕРЕМЕННОЕ ИМЯ ФАЙЛА?

#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 может помочь решить проблему такого рода