2008-09-26 20 views
5

¿Cómo obtener la ruta relativa en t sql? Tomemos como ejemplo que un archivo .sql está ubicado en la carpeta D: \ temp, quiero obtener la ruta del archivo hello.txt en la carpeta D: \ temp \ App_Data. ¿Cómo usar la referencia de ruta relativa?¿Ruta relativa en t sql?

Digamos que estoy ejecutando el archivo sql dentro del estudio de administración del servidor SQL.

+0

¿Desea hacerlo dentro de un procedimiento almacenado? –

+0

Sí, quiero hacerlo dentro de un procedimiento almacenado – Graviton

+0

No creo que el contenido de un archivo .sql tenga ningún conocimiento del archivo en el que estaban contenidos, es decir, no saben "dónde" están, por lo que no puede determinar o construir una ruta 'relativa'. –

Respuesta

3

El servidor está ejecutando el t-sql. No sabe de dónde el cliente cargó el archivo. Tendrá que tener la ruta integrada en el script.

DECLARE @RelDir varchar(1000) 
SET @RelDir = 'D:\temp\' 
... 

Tal vez se puede colocar mediante programación la ruta en el comando SET en el archivo de script .sql, o tal vez se puede utilizar sqlcmd y pasar el directorio relativo en como una variable.

6

El archivo .sql es solo ... un archivo. No tiene ningún sentido de su propia ubicación. Es lo que lo excuta (que no especificaste) que tendría una sensación de su ubicación, la ubicación del archivo.

Me di cuenta de que mencionó una carpeta App_Data, así que supongo que ASP.NET está involucrado. Si desea utilizar rutas relativas en su aplicación web, consulte MapPath

http://msdn.microsoft.com/en-us/library/system.web.httpserverutility.mappath.aspx

3

Cuando T-SQL se está ejecutando, se está ejecutando en un lote en el servidor, no en el equipo cliente que ejecuta Management Studio (o cualquier otro cliente SQL). El cliente simplemente envía el contenido de texto del archivo .sql al servidor para ser ejecutado. Entonces, a menos que ese archivo esté ubicado en el servidor de la base de datos, dudo mucho que pueda interactuar con él desde un script SQL.

1

El script t-sql es primero preprocesado por QueryAnalyzer, SSMS o sqlcmd en el lado del cliente. Estos programas conocen la ubicación local del archivo y podrían manejar fácilmente pathes relativos similares a Oeacle sqlplus.

Obviamente, esta es solo una decisión de diseño de Microsoft y me atrevería a decir que es bastante estúpida.

0

Bueno, no es algo de Microsoft primero ... es una cosa estándar de la industria. segundos su solución para el funcionamiento de T-SQL con una ruta relativa es el uso de un script por lotes o algo para inyectar su instrucción de ruta IE:

@echo OFF 
SETLOCAL DisableDelayedExpansion 
FOR /F "usebackq delims=" %%a in (`"findstr /n ^^ t-SQL.SQL"`) do (
    set "var=%%a" 
    SETLOCAL EnableDelayedExpansion 
    set "var=!var:*:=!" 
    set RunLocation=%~dp0 
    echo(%~dp0!var! > newsql.sql 
    ENDLOCAL 
) 
sqlcmd newsql.sql 

o algo así de todos modos

+0

gracias por limpiar esa lanza ... :) –

4

que tenía un problema similar, y lo resolvió usando variables sqlcmd junto con% pseudo-variable% CD. Tomó un poco de prueba y error para combinar todas las piezas. Pero finalmente lo consiguió todo funcionando. Este ejemplo espera que el archivo script.sql esté en el mismo directorio que el runscript.bat.

runscript.bat

sqlcmd -S .\SQLINSTANCE -v FullScriptDir="%CD%" -i script.sql -b 

script.sql

BULK INSERT [dbo].[ValuesFromCSV] 
FROM '$(FullScriptDir)\values.csv' 
with 
(
    fieldterminator = ',', 
    rowterminator = '\n' 
) 
go 
0

Probé método de los comentarios de mateuscb. Encontré que no puede funcionar, no sé por qué, luego lo logré después de varias pruebas. Se puede trabajar con el guión a continuación:

runscript.bat

@set FullScriptDir=%CD% 
sqlcmd -S .\SQLINSTANCE -i script.sql 

script.sql

BULK INSERT [dbo].[ValuesFromCSV] 
FROM '$(FullScriptDir)\values.csv' 
with 
(
    fieldterminator = ',', 
    rowterminator = '\n' 
) 
go 

Sólo para su información para continuar el debate.