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

时间:2014-05-28 23:16:09

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

我们的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可能)给我文件的当前路径?

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

我知道这个问题很老但是仍然很重要。我在以下情况下找到了一个可行的解决方案(什么是可选的,因为可以克服它):

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

以下是步骤:

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

答案 2 :(得分:-1)

您可以创建一个SSIS包并使用foreach Loop container遍历给定路径中的所有.csv文件。请参阅下面的Foreach Loop Container

的演示配置

enter image description here