SqlPackage.exe发布dacpac时yyyy-MM-dd格式datetime值导入报错解决
sqlpackage发布dacpac报datetime转换越界的解决方法
这个报错的核心原因是本地SQL Server实例的会话默认日期解析顺序和dacpac中存储的yyyy-MM-dd hh:mm:ss格式不匹配:当实例默认语言为简体中文时,默认日期解析顺序会出现错位,横杠分隔的日期字符串可能被解析为“月份值大于12”这类无效值,最终触发转换越界报错。
可按以下任意一种方案调整配置解决:
- 方案1:给发布命令追加连接参数,临时强制会话日期格式
直接修改sqlpackage.exe /Action:Publish执行命令,在目标连接串中追加Language=English参数,强制本次发布会话使用ISO标准的ymd日期解析顺序,示例命令:sqlpackage.exe /Action:Publish /SourceFile:"你的数据库文件路径.dacpac" /TargetServerName:"本地实例地址,比如localhost" /TargetDatabaseName:要导入的本地库名 /TargetConnectionString:"Data Source=localhost;Initial Catalog=master;Integrated Security=True;Language=English" - 方案2:修改本地SQL登录的默认语言,永久生效
如果不想每次执行命令都加参数,可以直接修改本地连接所用账号的默认语言配置:- 用SSMS连接本地SQL实例,先执行查询确认当前配置:
DBCC USEROPTIONS; -- 查看返回结果中的dateformat、language字段值 - 执行如下语句修改登录账号的默认语言(英语对应的日期解析顺序固定为ymd,和目标格式完全兼容):
-- 替换方括号内的内容为你本地连接用的登录名,Windows身份验证通常格式为 机器名\Windows用户名 ALTER LOGIN [你的本地登录账号名] WITH DEFAULT_LANGUAGE = English; - 修改完成后重启本地SQL Server服务,后续所有连接默认都会使用正确的日期解析规则。
- 用SSMS连接本地SQL实例,先执行查询确认当前配置:
- 方案3:修改发布配置文件
如果你是通过.publish.xml发布配置文件执行dacpac部署,直接在配置文件的TargetConnectionString节点追加语言配置即可:<TargetConnectionString>Data Source=.;Initial Catalog=目标本地库;Integrated Security=True;Pooling=False;Language=English</TargetConnectionString>
注意:不要直接解压修改dacpac内部的脚本文件,dacpac是结构化打包文件,手动修改很容易损坏文件结构导致发布失败。
内容的提问来源于stack exchange,提问作者AxD
相关产品推荐
相关产品推荐

