我在Visual Studio 2010中有一个数据库项目,在部署后的脚本中,我想将二进制数据从两个文件导入数据库。为此,我在从部署后脚本文件引用的文件中具有与以下代码非常相似的代码:
INSERT INTO [dbo].[MyTable] ([Column1], [Column2])
SELECT t1.BulkColumn, t2.BulkColumn
FROM
OPENROWSET(BULK N'$(ProjectDirectory)\Scripts\Post-Deployment\TestData\t1.dat', SINGLE_BLOB) AS t1,
OPENROWSET(BULK N'$(ProjectDirectory)\Scripts\Post-Deployment\TestData\t2.dat', SINGLE_BLOB) AS t2;
此之前已经工作了。我不知道它在什么时候停止工作,但现在,我似乎得到的只是错误SQL01262: The variable 'ProjectDirectory' has not been defined
(具有讽刺意味的是,部署后脚本本身的错误位置,第0行第0列)。我挖掘了项目根目录下的文件,发现它有点在项目文件中定义,在顶级<Project>
节点中有以下内容:
<ItemGroup>
<SqlCommandVariableOverride Include="ProjectDirectory=$(MSBuildProjectDirectory)" />
</ItemGroup>
在上面的代码段中将$(ProjectDirectory)
更改为$(MSBuildProjectDirectory)
后,除了错误消息中的变量名称外,没有更改任何内容。该错误发生在部署的验证阶段,而不是在部署期间。
在部署后脚本中,相对于项目根目录的引用文件的正确方法是什么,以便在数据库部署中包含这些文件的内容?
答案 0 :(得分:1)
我的情况非常相似。部署后脚本包含使用sqlcmd
的另一个sql文件:r "..\..\Another.sql"
在Another.sql中,我引用了Database.sqlcmdvars中定义的变量,VS抱怨该变量未定义。我手动编辑了项目文件。 PropertyGroup元素不包含子元素DeploymentConfigFile和SqlCommandVariablesFile,因此我从另一个PropertyGroup元素复制它们。我不知道这是否是正确的解决方案,但现在可以引用该变量。
<PropertyGroup Condition=" '$(Configuration)' == 'Populate' ">
<OutputPath>.\sql\Populate\</OutputPath>
<TargetDatabase>SomeDatabase</TargetDatabase>
<TargetConnectionString>Data Source=localhost;Integrated Security=True;Pooling=False</TargetConnectionString>
<DeploymentConfigFile>Properties\Database.sqldeployment</DeploymentConfigFile>
<SqlCommandVariablesFile>Properties\Database.sqlcmdvars</SqlCommandVariablesFile>
</PropertyGroup>