2

我在 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)除了错误消息中的变量名之外没有任何改变。该错误发生在部署的验证阶段,而不是部署本身。

在部署后脚本中,参考相对于项目根目录的文件的正确方法是什么,以便将这些文件的内容包含在数据库部署中?

4

1 回答 1

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>
于 2012-10-17T18:12:23.737 回答