我们的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
可能)给我文件的当前路径?
答案 0 :(得分:1)
您遇到的问题是.csv文件位于您的VS项目中,但脚本将在SQL Server上执行,因此文件应位于服务器可以访问的位置。也许,您可以添加一个Pre-Build事件,将.csv文件复制到服务器上的共享驱动器,然后在脚本中使用静态路径来获取共享位置的文件。
答案 1 :(得分:0)
我知道这个问题很老但是仍然很重要。我在以下情况下找到了一个可行的解决方案(什么是可选的,因为可以克服它):
以下是步骤:
BULK INSERT
[dbo].[Table1]
FROM '$(CurrentPath)\PathToFolderInsideOutputDirectory\Data1.csv'
WITH
(
ROWTERMINATOR = '0x0a',
FIELDTERMINATOR = ','
)
答案 2 :(得分:-1)
您可以创建一个SSIS包并使用foreach Loop container
遍历给定路径中的所有.csv文件。请参阅下面的Foreach Loop Container