所以,我有一个脚本,它使用批量插入从文件中提取文本并将其内容插入表中。我从文本文件加载,因为文本可能很大,在这样做时,我不需要担心转义。我让脚本在本地使用set定义的目录。 ex('C:\ Users \ me \ Files \ File.txt')但是,我需要在Post Deployment脚本中运行此脚本。我正在读取的文本文件位于同一个数据库项目中。我无法执行set定义的目录,因为目录可能会有所不同,具体取决于项目发布到的不同环境。有没有办法获得相对路径或获得部署后解决方案/项目目录的内容?
答案 0 :(得分:1)
因此,因为批量插入需要绝对路径,所以脚本没有相对路径的概念,并且这将部署在我不知道绝对路径的多个环境中。我决定使用Powershell和Bulk Insert。所以,我正在做的是,在数据库项目的预构建中,我调用我的Powershell脚本。 Powershell脚本能够找出其当前目录。我构建了一个在Post-Deployment脚本中调用的SQL文件。在这个SQL文件中,我使用当前目录批量插入。
答案 1 :(得分:1)
为什么不使用BCP:http://msdn.microsoft.com/en-us/library/ms162802.aspx?它可以处理相对路径。如果你能够使用所有PowerShell,我不明白为什么你不能调用BCP.EXE。它与BULK INSERT
基本上是相同的API。
答案 2 :(得分:1)
您是否考虑过在文件系统上使用标准位置?当我需要编写可移植的DOS / CMD脚本(包括通过T-SQL安装以供以后使用的东西,例如CREATE ASSEMBLY FROM)时,我会做类似的事情:
IF NOT EXIST C:\TEMP\MyInstallFolder (
MKDIR C:\TEMP\MyInstallFolder
)
REM put stuff into C:\TEMP\MyInstallFolder now that it is certain to be there)
REM CALL some process that looks in C:\TEMP\MyInstallFolder
MKDIR
将创建所有缺少的父文件夹。因此,像TEMP
这样的文件夹(曾经是运行Windows的PC上的标准版)通常不再存在,因为它们已移至每用户临时文件夹但已创建,然后创建MyInstallFolder
,导致没有错误。 IF NOT EXIST
将确保在首次运行后重新运行脚本也不会出错。