2016-03-23 3 views
0

Я пытаюсь создать группу файлов с FileStream следующим образом:Использование переменной в запросе

declare @filepath varchar(800) 
set @filepath = convert(sysname, SERVERPROPERTY('InstanceDefaultDataPath')) + N'MyDb_Files.ndf' 
print @filepath 

alter database MyDb add file (name = 'MyDb_Files', filename = filepath) to filegroup MyDb_Files; 
go 

Когда я запускаю это я получаю ошибку:

The path 'filepath' cannot be used for FILESTREAM files. 

Но если я заменю

filename = filepath 

от

filename = "[Output I get from print @filepath]" 

Тогда он отлично работает ... Поэтому использование переменной кажется проблемой.

Почему?

UPDATE

Я попытался следующие:

declare @sql nvarchar(800) 
set @sql = 
' 
declare @filepath nvarchar(800) 
set @filepath = concat(convert(sysname, SERVERPROPERTY("InstanceDefaultDataPath")), "MyDb.ndf")  
alter database MyDb add file (name = "MyDb_Files", filename = @filepath to filegroup MyDb_Files;   
' 
exec (@sql) 

Но я получаю сообщение об ошибке: Неправильный синтаксис около '@filepath'.

Что я делаю сейчас неправильно?

+3

Не должно быть 'filename = @ filepath'? –

+0

Когда я использую это, я получаю сообщение об ошибке «неправильный sintax около пути к файлу. Ожидающий идентификатор, целое число, строка или text_lex ... Как исправить это? –

+0

А ... затем попробуйте что-то по строкам' set @strSql = '< ваш полный оператор alter> '', за которым следует 'EXEC @ strSql'? –

ответ

0

Проблема заключается в том, что вы пытаетесь использовать параметр (@filepath) в операторе DDL, который не допускает такую ​​конструкцию; аргумент filename в DDL принимает литералы. Скопировано из (https://msdn.microsoft.com/en-us/library/bb522469.aspx):

<filespec>::= 
(
NAME = logical_file_name 
[ , NEWNAME = new_logical_name ] 
[ , FILENAME = {'os_file_name' | 'filestream_path' | 'memory_optimized_data_path' } ] 
[ , SIZE = size [ KB | MB | GB | TB ] ] 
[ , MAXSIZE = { max_size [ KB | MB | GB | TB ] | UNLIMITED } ] 
[ , FILEGROWTH = growth_increment [ KB | MB | GB | TB| % ] ] 
[ , OFFLINE ] 
) 

Вам придется использовать динамический SQL и убедитесь, что вы защитите себя от SQLI, например:

declare @filepath nvarchar(800) 
declare @sql nvarchar(max) 
set @filepath = concat(convert(sysname, SERVERPROPERTY('InstanceDefaultDataPath')), 'MyDb.ndf')  
set @sql = N' 
alter database MyDb add file (name = "MyDb_Files", filename = '''+ replace(@filepath, '''', '''''') + N''') to filegroup MyDb_Files;   
' 
EXEC (@sql) 

я больше говорить об этой теме на старом блоге post: https://blogs.msdn.microsoft.com/raulga/2007/01/04/dynamic-sql-sql-injection/, в разделе «Когда параметризация не является опцией». Надеюсь, вы найдете эту информацию полезной.

Смежные вопросы