在部署后 SQL 文件中指定相对路径

Posted

技术标签:

【中文标题】在部署后 SQL 文件中指定相对路径【英文标题】:Specifying a relative path in Post-Deployment SQL files 【发布时间】:2014-05-28 23:16:08 【问题描述】:

我们的SQL Server 项目中有一个部署后脚本,它实际上执行bulk-insert 以在创建表后填充表。这是通过读取几个.csv 文件来完成的:

BULK INSERT
    [dbo].[Table1]
    FROM '.\SubFolder\TestData\Data1.csv'
    WITH
    (
        ROWTERMINATOR = '0x0a',
        FIELDTERMINATOR = ','
    )

BULK INSERT
    [dbo].[Table2]
    FROM '.\SubFolder\TestData\Data2.csv'
    WITH
    (
        ROWTERMINATOR = '0x0a',
        FIELDTERMINATOR = ','
    )

问题是 Visual Studio 很难找到文件:

Cannot bulk load because the file ".\SubFolder\TestData\Data1.csv" could not be opened. 
Operating system error code 3(The system cannot find the path specified.).

.csv 文件已签入源代码管理,当我转到它们在我的机器上映射到的文件夹时,我确实看到了它们。我假设问题是. 没有返回正在执行的 sql 文件的当前路径。有没有办法获取相对路径?是否有一个宏(或者可能是 SQLCMD Variable)可以提供文件的当前路径?

【问题讨论】:

【参考方案1】:

您遇到的问题是 .csv 文件在您的 VS 项目中,但脚本将在 SQL Server 上执行,因此这些文件应该位于服务器可以访问的位置。或许,您可以添加一个 Pre-Build 事件,将 .csv 文件复制到服务器上的共享驱动器,然后在脚本中使用静态路径从共享位置获取文件。

【讨论】:

【参考方案2】:

我知道这个问题已经很老了,但仍然很重要。我在以下条件下找到了解决这个问题的有效方法(什么是可选的,因为有办法克服它):

您将使用 Visual Studio IDE 中的“发布”选项来部署您的应用。 csv 文件是您项目的一部分,并配置为复制到输出文件夹。

步骤如下:

    打开项目属性并转到 SQLCMD 变量部分。 添加新变量(例如 $(CurrentPath)) 默认值:$(ProjectDir)$(OutputPath) 将您的 BULK 代码更改为:
BULK INSERT
    [dbo].[Table1]
    FROM '$(CurrentPath)\PathToFolderInsideOutputDirectory\Data1.csv'
    WITH
    (
        ROWTERMINATOR = '0x0a',
        FIELDTERMINATOR = ','
    )
    全部保存并编译。 使用发布测试您的部署,确保 $(CurrentPath) 变量显示正确的路径(或按“加载值”按钮),按发布按钮,一切正常。

【讨论】:

【参考方案3】:

您可以创建一个 SSIS 包并使用 foreach Loop container 循环遍历给定路径中的所有 .csv 文件。下面看Foreach Loop Container的demo配置

【讨论】:

问题是我不知道路径是什么。 csv 文件在源代码管理中,不同的用户将根据他们将解决方案映射到的文件夹具有不同的路径。 是的,您可以为目录路径使用一个变量,该变量将在运行时填充。任何执行包的用户都会在执行包之前在运行时提供路径。 我正在尝试看看 VS 是否可以找到文件本身而无需要求用户指定路径... 你怎么能指望sql server知道路径:) 这正是我问是否有宏或其他东西的原因:)

以上是关于在部署后 SQL 文件中指定相对路径的主要内容,如果未能解决你的问题,请参考以下文章

绝对路径和相对路径有啥区别?

Web 部署 - 使用相对路径进行本地文件系统部署

Web 部署 - 使用相对路径进行本地文件系统部署

Vue项目打包后的资源引用如何使用相对路径

动态链接--so的搜索过程

详解Python中的相对导入和绝对导入