如何像SSDT一样,在sqlcmd模式下让SSMS与:r一起使用当前脚本的相对路径?


11

如果我在同一文件夹中有foo.sql和bar.sql,则当使用:r ".\bar.sql"。但是,SSMS找不到它。Procmon显示SSMS正在寻找%systemroot%\syswow64

带注释的Procmon屏幕截图

如何告诉SSMS在不显式声明路径的情况下查看当前脚本保存到的文件夹?

Answers:


8

在SSMS中获得相对路径并不是那么简单,因为您没有执行脚本。SSMS已将脚本加载到内存中并正在执行其文本。因此,当前目录/文件夹是默认进程开始文件夹。您可以通过在SSMS中以SQLCMD模式运行以下命令来查看此消息:

!! PWD

但是,我确实找到了一种实现此目的的方法。我承认这不是实现此目的的最理想的方法,但是,它目前似乎是获得真实相对路径的唯一方法(假设在变量中设置路径本身并不是真正的“相对” )。

因此,您可以做的是:

  1. 执行DOS命令以查找foo.sql,并将该文件的路径存储在您可以从SSMS获取的文件夹中的文本文件中,这是因为它是硬编码路径,或者因为它使用了可用于DOS命令和SSMS中的SQLCMD模式
  2. 将路径存储在该文件中时,将其存储为SQLCMD模式命令,该命令将变量设置为该路径
  3. 使用将该文本文件导入SSMS :r,它将将该变量设置为所需的路径
!! CD C:\ & FOR /F %B IN ('DIR /B /A -HS /S foo.sql') DO ECHO :setvar mypath "%~dpB" > %TEMP%\relative_path.txt

:r $(TEMP)\relative_path.txt

:r $(mypath)\bar.sql

笔记:

  • 上面的方法假定系统上只有1个文件名为foo.sql。如果有多个文件具有该名称,则找到的最后一个将是relative_path.txt文件中设置的路径

  • 这样做CD C:\将从C:驱动器的根目录开始。这可能不是最有效的起点。如果您通常将SQL文件放在C:\ Users {YourLogin} \ Documents \ Visual Studio 2013 \ Projects等区域中,则只需更改CD命令以使其更接近目的地,例如:

    !! CD C:\Users\{YourLogin}\Documents\Visual Studio 2013 & FOR ...

这是有创意的,但是速度很慢并且占用大量磁盘。
贾斯汀·迪林

2
@JustinDearing正如我在回答中所说,这是a)不理想的,并且b)如果从根目录开始运行速度很慢,但是c)我看到这样做的唯一方法是技术上的相对。我不确定对硬盘进行索引是否可以消除性能问题。
所罗门·鲁茨基

虽然这让我感到难过,但这绝对是最好的答案,它不涉及设置另一个命令脚本的路径或将其硬编码到文件中。
QueueHammer


2

我建议将您的sqlcmd变量文件保存在'C:\ Users \ your_nt_login_name \ AppData \ Local \ Temp'中,并在我所有项目中将其引用为$(TEMP)\ sqlcmd_variables.sql。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.