在部署后 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 文件中指定相对路径的主要内容,如果未能解决你的问题,请参考以下文章