如何获取tql中的相对路径?例如,一个.sql文件位于文件夹D:\ temp中,我想在文件夹D:\ temp \ App_Data中获取文件hello.txt的路径。如何使用相对路径引用?
假设我正在SQL服务器管理工作室内执行sql文件。
答案 0 :(得分:7)
我有一个类似的问题,并使用sqlcmd变量和%CD%伪变量解决了这个问题。进行了一些试验和错误,以结合所有的部分。但最终还是把它全部搞定了。此示例要求script.sql
文件与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
答案 1 :(得分:6)
.sql文件只是....一个文件。它没有任何自己的位置感。它可以帮助它(你没有指定),它可以了解它的位置,文件的位置。
我注意到你提到了一个App_Data文件夹,所以我猜这涉及ASP.NET。如果要在Web应用程序中使用相对路径,请参阅MapPath
http://msdn.microsoft.com/en-us/library/system.web.httpserverutility.mappath.aspx
答案 2 :(得分:3)
当T-SQL正在执行时,它在服务器上批量运行,而不是在运行Management Studio(或任何其他SQL客户端)的客户端计算机上运行。客户端只是将.sql文件的文本内容发送到要执行的服务器。因此,除非该文件位于数据库服务器上,否则我非常怀疑您是否能够从SQL脚本与其进行交互。
答案 3 :(得分:3)
服务器正在执行t-sql。它不知道客户端从哪里加载文件。您必须在脚本中嵌入路径。
DECLARE @RelDir varchar(1000)
SET @RelDir = 'D:\temp\'
...
也许您可以通过编程方式将路径放入.sql脚本文件中的SET命令中,或者也许您可以使用sqlcmd并将相对目录作为变量传递。
答案 4 :(得分:1)
t-sql脚本首先由客户端的QueryAnalyzer,SSMS或sqlcmd进行预处理。这些程序知道文件localcation,并且可以轻松处理类似于Oeacle sqlplus的相关路径。
显然这只是微软的一个设计决定,我敢说一个相当愚蠢的决定。
答案 5 :(得分:1)
我尝试了mateuscb的评论方法。 我发现它无法工作,我不知道为什么,然后我经过几次测试后管理。 它可以使用下面的脚本:
<强> 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
仅供参考,以供进一步讨论。
答案 6 :(得分:0)
@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
无论如何或类似的东西