Azure SQL跨数据库查询无法按DATETIME类型过滤的问题
在Azure SQL Database中使用外部表查询另一Azure SQL数据库的数据时,若按DATETIME列过滤外部表:
- 毫秒位最后一位为3或7时,查询无返回结果
- 毫秒位最后一位为0时,查询运行符合预期
示例
/* 毫秒最后一位为0 - 运行符合预期 */ DECLARE @myDate DATETIME = '2021-10-27 12:00:00.000'; SELECT * from dbo.ext_datetimetest where myDate = @myDate; GO /* 毫秒最后一位为3或7 - 无返回结果 */ DECLARE @myDate DATETIME = '2021-10-27 12:00:00.003'; SELECT * from dbo.ext_datetimetest where myDate = @myDate; GO
注意事项
- 仅参数化查询受影响,WHERE子句中硬编码datetime值的所有查询均可正常运行
- 仅跨数据库查询受影响,直接在源数据库运行该类查询符合预期
- 相关代码已稳定运行多年,该异常上周才首次出现
- 该问题仅出现在测试与生产环境,开发环境下所有datetime值的查询均正常
复现步骤
/* 在数据库#1中执行 */ CREATE TABLE dbo.datetimetest (myDate DATETIME NOT NULL); GO INSERT dbo.datetimetest (myDate) VALUES ('2021-10-27 12:00:00.000') ,('2021-10-27 12:00:00.003') ,('2021-10-27 12:00:00.007') ,('2021-10-27 12:00:00.010') ; GO /* 在数据库#2中执行 */ CREATE EXTERNAL TABLE dbo.ext_datetimetest ( myDate DATETIME NOT NULL) WITH (DATA_SOURCE = [DATABASE #1], SCHEMA_NAME = N'dbo', OBJECT_NAME = N'datetimetest'); GO /* 查询所有行确认数据存在 */ SELECT * FROM dbo.ext_datetimetest; /* 以下查询均可正常运行,因为过滤条件是硬编码的 */ SELECT * from dbo.ext_datetimetest where myDate = '2021-10-27 12:00:00.000'; SELECT * from dbo.ext_datetimetest where myDate = '2021-10-27 12:00:00.003'; SELECT * from dbo.ext_datetimetest where myDate = '2021-10-27 12:00:00.007'; SELECT * from dbo.ext_datetimetest where myDate = '2021-10-27 12:00:00.010'; GO /* 变量查询仅在最后一位为0时正常运行 */ DECLARE @myDate DATETIME; SET @myDate = '2021-10-27 12:00:00.000'; SELECT * from dbo.ext_datetimetest where myDate = @myDate; /* 正常运行 */ SET @myDate = '2021-10-27 12:00:00.003'; SELECT * from dbo.ext_datetimetest where myDate = @myDate; /* 无返回结果 */ SET @myDate = '2021-10-27 12:00:00.007'; SELECT * from dbo.ext_datetimetest where myDate = @myDate; /* 无返回结果 */ SET @myDate = '2021-10-27 12:00:00.010'; SELECT * from dbo.ext_datetimetest where myDate = @myDate; /* 正常运行 */ GO
内容的提问来源于stack exchange,提问作者RobertT
相关产品推荐
相关产品推荐

