【问题标题】:Specifying a relative path in Post-Deployment SQL files在部署后 SQL 文件中指定相对路径
【发布时间】: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)可以提供文件的当前路径?

【问题讨论】:

    标签: sql-server visual-studio-2012 project sql-scripts


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      步骤如下:

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

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