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

Sql server 在部署后SQL文件中指定相对路径,sql-server,visual-studio-2012,project,sql-scripts,Sql Server,Visual Studio 2012,Project,Sql Scripts,在我们的sqlserver项目中有一个部署后脚本,它基本上执行批量插入,在创建表之后填充表。这是通过读取几个.csv文件来完成的: BULK INSERT [dbo].[Table1] FROM '.\SubFolder\TestData\Data1.csv' WITH ( ROWTERMINATOR = '0x0a', FIELDTERMINATOR = ',' ) BULK INSERT [dbo].[Tabl

在我们的
sqlserver
项目中有一个部署后脚本,它基本上执行
批量插入
,在创建表之后填充表。这是通过读取几个
.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变量
可能)可以为我提供文件的当前路径?

您可以创建一个SSIS包,并使用
foreach循环容器
循环给定路径中的所有.csv文件。请参见下面的
Foreach循环容器的演示配置


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

我知道这个问题很老,但仍然相关。我在以下条件下找到了解决此问题的有效方法(哪些是可选的,因为有克服它的方法):

  • 您将在VisualStudioIDE中使用“发布”选项来部署应用程序
  • csv文件是项目的一部分,配置为复制到输出文件夹
以下是步骤:

  • 打开项目属性并转到SQLCMD变量部分
  • 添加新变量(例如$(CurrentPath))
  • 在默认值put:$(ProjectDir)$(OutputPath)
  • 将批量代码更改为:
  • 批量插入
    [dbo]。[表1]
    来自“$(CurrentPath)\PathToFolderInsideOutputDirectory\Data1.csv”
    具有
    (
    行终止符='0x0a',
    字段终止符=','
    )
    
  • 保存所有文件并编译
  • 使用publish测试您的部署,确保$(CurrentPath)变量显示正确的路径(或按“Load values”按钮),按publish按钮,所有这些都应该可以工作

  • 问题是我不知道路径是什么。csv文件在源代码管理中,不同的用户将根据他们将解决方案映射到的文件夹拥有不同的路径。是的,您可以使用目录路径变量,该变量将在运行时填充。任何执行包的用户都将在执行包之前在运行时提供路径。我正在尝试看看是否有一种方法可以让VS在不要求用户指定路径的情况下定位文件本身……您怎么能期望sql server知道路径:)这正是我问是否有宏或其他内容的原因:)