SSDT 发布脚本无需更改即可重新创建过程
SSDT publish script recreates procedures with no changes
我有一个数据库导入到 .sqlproj
,还有一个 .publish.xml
发布配置文件,用于将更改发布到远程数据库。
我的理解是,当我右击 -> 发布 -> 生成脚本时,它应该计算本地定义和远程数据库之间的差异,并生成一个脚本来使远程数据库保持一致。
这一切似乎工作正常,但是,它生成的脚本总是包含 ALTER FUNCTION
和 ALTER PROCEDURE
相同的 40 个左右函数和过程的语句(总共约 1000 个已定义), 无论它们是否改变。当我将 ALTER
语句与脚本函数 as -> ALTER to SSMS 中的脚本进行比较时,它们完全相同。
所以我的问题是:为什么 VS 认为它们不同,或者如果它们相同,为什么它会重新创建它们?
备注:
- 这些函数并不特殊 - 其中一些函数就像定义一个 varchar、将其设置为一个值并返回它一样简单。
- 我已经尝试 运行 将
ALTER
脚本导入数据库,但它们继续生成。
- 我已经检查了 SSMS 中的属性(右键单击 -> 属性),但看不到它始终重新创建的属性与不重新创建的属性有任何明显不同。
- 我的发布配置文件是沼泽标准配置文件。
谢谢
更新:
通过将 .dacpac 重命名为 .zip 并提取 model.xml,我可以看到某些程序的 <HeaderContents>
具有 

(LF - 换行符)在他们中。
这让我意识到,出于某种原因,我所有的 .SQL 文件都有 unix 行结尾 (LF) 而不是 windows 行结尾 (CR LF)。将所有文件转换为 window 行结尾 (using notepad++) 解决了问题。
原文:
好的,看起来大部分是由于脚本中的字符串常量包含换行符。用手动定义的字符替换它们意味着它们不再被重新部署。
即
SET @doesnt_work =
'FOO
BAR'
可以换成
SET @works = 'FOO' + CHAR(13) + CHAR(10) + 'BAR'
注意:这与其说是解决方案,不如说是一种变通方法,希望有人可以提出更好的方法...
我遇到了这个问题,并且能够通过以下方式解决它:
正在更改我的全局 Git 配置以使用 Windows 行结尾:
git config --global core.autocrlf true
.
正在删除本地存储库并重新克隆它。
我有一个数据库导入到 .sqlproj
,还有一个 .publish.xml
发布配置文件,用于将更改发布到远程数据库。
我的理解是,当我右击 -> 发布 -> 生成脚本时,它应该计算本地定义和远程数据库之间的差异,并生成一个脚本来使远程数据库保持一致。
这一切似乎工作正常,但是,它生成的脚本总是包含 ALTER FUNCTION
和 ALTER PROCEDURE
相同的 40 个左右函数和过程的语句(总共约 1000 个已定义), 无论它们是否改变。当我将 ALTER
语句与脚本函数 as -> ALTER to SSMS 中的脚本进行比较时,它们完全相同。
所以我的问题是:为什么 VS 认为它们不同,或者如果它们相同,为什么它会重新创建它们?
备注:
- 这些函数并不特殊 - 其中一些函数就像定义一个 varchar、将其设置为一个值并返回它一样简单。
- 我已经尝试 运行 将
ALTER
脚本导入数据库,但它们继续生成。 - 我已经检查了 SSMS 中的属性(右键单击 -> 属性),但看不到它始终重新创建的属性与不重新创建的属性有任何明显不同。
- 我的发布配置文件是沼泽标准配置文件。
谢谢
更新:
通过将 .dacpac 重命名为 .zip 并提取 model.xml,我可以看到某些程序的 <HeaderContents>
具有 

(LF - 换行符)在他们中。
这让我意识到,出于某种原因,我所有的 .SQL 文件都有 unix 行结尾 (LF) 而不是 windows 行结尾 (CR LF)。将所有文件转换为 window 行结尾 (using notepad++) 解决了问题。
原文:
好的,看起来大部分是由于脚本中的字符串常量包含换行符。用手动定义的字符替换它们意味着它们不再被重新部署。 即
SET @doesnt_work =
'FOO
BAR'
可以换成
SET @works = 'FOO' + CHAR(13) + CHAR(10) + 'BAR'
注意:这与其说是解决方案,不如说是一种变通方法,希望有人可以提出更好的方法...
我遇到了这个问题,并且能够通过以下方式解决它:
正在更改我的全局 Git 配置以使用 Windows 行结尾:
git config --global core.autocrlf true
.正在删除本地存储库并重新克隆它。