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

Jus*_*ing 11 sql-server ssms sqlcmd ssdt

如果我在同一个文件夹中有 foo.sql 和 bar.sql,则 foo.sql 在 sqlcmd 模式下从 SSDT 运行时可以引用 bar.sql :r ".\bar.sql"。但是,SSMS 不会找到它。Procmon 显示 SSMS 正在寻找%systemroot%\syswow64

带注释的 Procmon 屏幕截图

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

Sol*_*zky 8

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

!! PWD
Run Code Online (Sandbox Code Playgroud)

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

所以你可以做的是:

  1. 执行 DOS 命令以查找foo.sql并将该文件的路径存储在您可以从 SSMS 获取的文件夹中的文本文件中,因为它是硬编码的路径,或者因为它使用了可用于SSMS 中的 DOS 命令和 SQLCMD 模式
  2. 在该文件中存储路径时,将其存储为 SQLCMD 模式命令,该命令将变量设置为该路径
  3. 使用将该文本文件导入到 SSMS 中:r,它将将该变量设置为所需的路径
!! PWD
Run Code Online (Sandbox Code Playgroud)

笔记:

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

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

    !! 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
    
    Run Code Online (Sandbox Code Playgroud)

  • @JustinDearing 正如我在回答中所说,它 a) 不理想,并且 b) 如果从根目录开始会很慢,但是 c) 我能看到的唯一方法是_技术上_相对的。我不确定索引硬盘驱动器是否会消除性能问题。 (2认同)

SQL*_*mer 5

我可能是错的,但我认为这是不可能的。请参阅这些链接以获取其他人所做的示例(没有一个是理想的)。

/sf/ask/612747901/

http://boardreader.com/thread/Specifying_relative_path_to_r_command_in_lmlz__f0c78408-e001-48a2-8369-338c9534f496.html