SELECT*中有时会丢失计算列

Mik*_*sdf 9 sql azure azure-sql-database

在SQL Azure中,我有一个或多或少像这样设置的表,有两个计算列(IsExpiredIsDeadlineExpired),只是将不可为空的日期时间列与当前时间进行比较:

CREATE TABLE [dbo].[Stuff]
(
   [StuffId] int NOT NULL IDENTITY(1,1),
   [Guid] uniqueidentifier NOT NULL,
   [ExpirationDate] datetime NOT NULL,
   [DeadlineDate] datetime NOT NULL,
   [UserId] int NOT NULL,
   [IsExpired] AS CAST((CASE WHEN [ExpirationDate] < GETUTCDATE() THEN 1 ELSE 0 END) AS bit),
   [IsDeadlineExpired] AS CAST((CASE WHEN [DeadlineDate] < GETUTCDATE() THEN 1 ELSE 0 END) AS bit),
   CONSTRAINT [PK_StuffId] PRIMARY KEY ([StuffId]),
   CONSTRAINT [UNQ_Guid] UNIQUE([Guid]),
)
GO
Run Code Online (Sandbox Code Playgroud)

我有一个包含多个结果集的存储过程,其中一个结果集:

SELECT * FROM [dbo].[Stuff] WHERE [Guid] = @guid
Run Code Online (Sandbox Code Playgroud)

我最近发现表明,有时当结果集读取错误日志SqlDataReader,SqlDataReader.GetOrdinal("IsExpired")失败IndexOutOfRangeException.我知道前面的列甚至在这些情况下工作正常,因为它们在前面的代码行中被读取而没有错误.我也相信程序的结果集是按正确顺序排列的,因为它们不共享列名(否则读取前面的列同样会失败).

另外:大多数时候一切似乎都很完美.

这可以归因于Azure瞬态故障吗?

Mik*_*sdf 0

查看一些旧日志,得出的结论是,只有在同时部署 DACPAC 的同时运行查询时才会发生此错误(作为我们对此特定测试环境的自动化部署的一部分)。

我假设架构在 DACPAC 部署期间不一定处于可靠状态。

从那时起,我们添加了一些代码,以便在部署期间将应用程序置于“维护模式”(甚至是这些自动化的)。这似乎可以缓解这个问题。