Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 为什么我的SQL在添加覆盖索引时失败了?_Sql Server_Indexing_Covering Index - Fatal编程技术网

Sql server 为什么我的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,

我完全被这个弄糊涂了。我在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, 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年推出的