Sql server 为什么我的SQL在添加覆盖索引时失败了?
我完全被这个弄糊涂了。我在SQL Server 2017表中添加了覆盖索引,集成测试失败 下面是一些简单的SQL来说明问题:Sql server 为什么我的SQL在添加覆盖索引时失败了?,sql-server,indexing,covering-index,Sql Server,Indexing,Covering Index,我完全被这个弄糊涂了。我在SQL Server 2017表中添加了覆盖索引,集成测试失败 下面是一些简单的SQL来说明问题: CREATE TABLE MyColumns (ColumnID INT PRIMARY KEY, LookupCodeTypeID INT) INSERT INTO MyColumns (ColumnID, LookupCodeTypeID) VALUES (18, 37) CREATE TABLE MyCodes (CodeID INT PRIMARY KEY,
CREATE TABLE MyColumns (ColumnID INT PRIMARY KEY, LookupCodeTypeID INT)
INSERT INTO MyColumns (ColumnID, LookupCodeTypeID)
VALUES (18, 37)
CREATE TABLE MyCodes (CodeID INT PRIMARY KEY, CodeTypeID INT, Code NVARCHAR(50), IsDeleted BIT)
INSERT INTO MyCodes (CodeID, CodeTypeID, Code, IsDeleted)
VALUES (1, 12, 'North', 0), (2, 12, 'South', 0), (19, 37, '0', 0),
(20, 37, '1', 0), (21, 37, '2', 1), (22, 37, '3', 0)
SELECT CAST(Code AS INT) AS CodeIndex
FROM MyCodes
INNER JOIN MyColumns ON LookupCodeTypeID = CodeTypeID
WHERE ColumnID = 18 AND IsDeleted = 0
ORDER BY CodeIndex
-- This index was created for other reasons but the following SQL broke
CREATE NONCLUSTERED INDEX IX1_MyCodes ON MyCodes (CodeTypeID) INCLUDE (Code)
SELECT CAST(Code AS INT) AS CodeIndex
FROM MyCodes
INNER JOIN MyColumns ON LookupCodeTypeID = CodeTypeID
WHERE ColumnID = 18 AND IsDeleted = 0
ORDER BY CodeIndex
创建索引是为了解决其他地方的另一个问题,但是失败的测试让我想到了这段代码
通过尝试创建一个示例来重现问题,我可以看到,对于这段代码,将IsDeleted
添加到覆盖索引可以解决问题,但这不是我所期望的
由于测试突出了这个问题,我将在覆盖索引中添加IsDeleted
我的问题是,为什么SQL会崩溃?既然只有部分代码进行了集成测试,我如何预测还会有什么崩溃?你说的“它崩溃”是什么意思?我猜它坏了,因为您做出了一个不安全的假设,即服务器以某种严格的顺序计算表达式,现在它正试图将
转换为int
。这种假设总是不安全的。这看起来有点像您创建了一个真正的查找表(OTLT)。如果可能,请使用TRY\u CAST
。谢谢。那个works@RaymondNijland-不要在联机丛书中删除版本信息。他们不需要为不受支持的版本进行回填,因为SELECT
可能会在过去10年中引入<代码>试播实际上是在2012年推出的