Sql server sql中的相对路径?

Sql server sql中的相对路径?,sql-server,tsql,Sql Server,Tsql,如何在t sql中获取相对路径?例如,一个.sql文件位于文件夹D:\temp中,我想获取文件夹D:\temp\App\u Data中文件hello.txt的路径。如何使用相对路径引用 假设我正在sql server management studio中执行sql文件。该.sql文件只是。。。。档案。它对自己的位置没有任何感觉。它是执行它(您没有指定)的东西,它可以感知它的位置,文件的位置 我注意到你提到了一个App_数据文件夹,所以我猜其中涉及到了ASP.NET。如果要在web应用程序中使用相

如何在t sql中获取相对路径?例如,一个
.sql
文件位于文件夹
D:\temp
中,我想获取文件夹
D:\temp\App\u Data
中文件hello.txt的路径。如何使用相对路径引用


假设我正在sql server management studio中执行sql文件。

该.sql文件只是。。。。档案。它对自己的位置没有任何感觉。它是执行它(您没有指定)的东西,它可以感知它的位置,文件的位置

我注意到你提到了一个App_数据文件夹,所以我猜其中涉及到了ASP.NET。如果要在web应用程序中使用相对路径,请参见MapPath


执行T-SQL时,它在服务器上批量运行,而不是在运行Management Studio(或任何其他SQL客户机)的客户机上运行。客户机只是将.sql文件的文本内容发送到要执行的服务器。因此,除非该文件位于数据库服务器上,否则我高度怀疑您能否通过SQL脚本与之交互。

服务器正在执行t-SQL。它不知道客户端从何处加载文件。您必须在脚本中嵌入路径

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

也许您可以通过编程将路径放入.sql脚本文件中的SET命令中,或者您可以使用sqlcmd并将相对目录作为变量传入。

t-sql脚本首先由客户端的QueryAnalyzer、SSMS或sqlcmd预处理。这些程序知道文件的本地位置,并且可以轻松地处理类似于Oeacle sqlplus的相对路径


显然,这只是微软的一个设计决定,我敢说这是一个相当愚蠢的决定。

好吧,首先这不是微软的事情。。。这是一个行业标准的东西。 其次,使用相对路径运行T-SQL的解决方案是使用批处理脚本或其他东西来注入path语句,即:

@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

或者类似的问题

我遇到了一个类似的问题,并使用sqlcmd变量和%CD%伪变量解决了它。需要一点尝试和错误来组合所有的片段。但最终一切都成功了。本例要求
script.sql
文件与
runscript.bat
文件位于同一目录中

runscript.bat

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

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

我从Mateusb的评论中尝试了这个方法。 我发现它不能工作,我不知道为什么,然后我管理后,几次测试。 它可以使用以下脚本:

runscript.bat

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

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

仅供您进一步讨论。

您不想在存储过程中执行此操作吗?是的,我确实想在存储过程中执行此操作。我不相信.sql文件的内容知道它们所包含的文件,也就是说,它们不知道它们的“位置”,因此无法确定或构造“相对”路径。