2011-04-08 18 views
5

Quiero agregar un archivo/grupo de archivos a una base de datos existente, pero necesito obtener la ruta de una variable porque será diferente cuando se finalice este script. Cuando verifico el script en SQL Management Studio 2008 R2, devuelve un error al FILENAME = @Path.ALTER DATABASE/ADD FILE/VARIABLE FILENAME?

¿Cómo puedo usar esa variable?

script no se ejecutará la línea de comandos!

ALTER DATABASE [MyDB] 
ADD FILEGROUP [MyDB_FileStream] CONTAINS FILESTREAM 
GO 

DECLARE @Path VARCHAR(MAX) 
SET @Path = 'C:\whatEverIWantItToBe\ThisCouldChangeWithLogic\YouGetThePoint\' 

ALTER DATABASE [MyDB] 
ADD FILE 
    (NAME = 'MyDB_FileStream' 
    , FILENAME = @Path 
    ) 
TO FILEGROUP [MyDB_FileStream] 

Respuesta

8

El uso de SQL dinámico:

Declare @Path nvarchar(max) 
Declare @Sql nvarchar(max) 

Set @Path = 'C:\whatEverIWantItToBe\ThisCouldChangeWithLogic\YouGetThePoint\' 

Set @Sql = 'Alter Database [MyDb] 
    Add File(Name = ''MyDb_FileStream'' 
      , FileName = ' + QuoteName(@Path, '''') 
      + ') To FileGroup [MyDbFileStream]' 

Exec(@Sql) 
+0

GRACIAS MUCHO !!! Siempre he odiado el SQL dinámico porque me pareció "escapado" al analizar el análisis sintáctico para detectar errores ... pero tal vez tiene sus aplicaciones –

+4

Solo asegúrese de que @Path provenga de una fuente confiable, y no de Little Bobby Tables http: // xkcd .com/327/ – SqlACID

+0

@SqlACID - ¿Qué podría pasar a la variable @Path que causaría la ejecución de una declaración que no deseaba? El problema vendrá cuando intente ejecutar el proceso almacenado (presumiblemente debido a que estamos usando una variable) desde el lado del cliente, no desde el propio proceso. Suponiendo que la llamada a la llamada de proceso almacenada está parametrizada, ¿qué podría pasarse a @Path que no se escaparía o error? – Thomas

0

No he probado, pero por lo general SQL dinámico puede ayudar a resolver este tipo problema

+0

tienes un ejemplo? –

2

No estoy seguro de si eso va a trabajar para usted, pero si usted va a ejecutar el script desde una línea de comandos usted podría hacer:

ALTER DATABASE [MyDB] 
ADD FILE (NAME = 'MyDB_FileStream', FILENAME = $(path)) 
TO FILEGROUP [MyDB_FileStream] 

y ejecutarlo con:

sqlcmd -s servername -i script.sql -v path="path to the file" 
+0

La pregunta ha sido editada .... No lo haré y NO PUEDO ejecutarlo desde la línea de comando –

Cuestiones relacionadas