相关疑难解决方法(0)

为什么在 SQL Server 2012 中查询结果集为空会出错?

在 MS SQL Server 2012 中运行以下查询时,第二个查询失败,但第一个查询失败。此外,在没有 where 子句的情况下运行时,两个查询都将失败。我不知道为什么两者都会失败,因为两者都应该有空的结果集。任何帮助/见解表示赞赏。

create table #temp
(id     int primary key)

create table #temp2
(id     int)

select 1/0
from #temp
where id = 1

select 1/0
from #temp2
where id = 1
Run Code Online (Sandbox Code Playgroud)

sql-server sql-server-2012

33
推荐指数
2
解决办法
7031
查看次数

隐式转换有时会导致错误

在最后一天左右的时间里,我一直在为这个问题摸不着头脑——我只是不明白为什么一个过程在一种环境中有效,但由于转换错误(相同的数据,相同的代码)而在另一种环境中失败。

工作服务器的计划(大幅削减版本)位于: https: //www.brentozar.com/pastetheplan/ ?id=B1jZWTfOf

(这似乎不起作用,所以我已将计划 XML 上传到此处的 Pastebin: https: //pastebin.com/47Q6nniw

导致问题的相关列的一些背景知识:

propertyInst 表包含一个名为 ValueStr 的列,它是 nvarchar 数据类型。GeneralLedgerCode 表具有数据类型 int 的列 id。我们的开发人员正在尝试连接两个表。ValueStr 列保存文本数据、XML 数据、整数数据、小数数据等。当然,我们决定添加一个函数来确保仅解析整数 (ISNUMERIC(ValueStr) = 1)。我们没有意识到的是,这也会尝试转换任何十进制值 - 这会导致自然生产中的转换错误:

将 nvarchar 值“0.1”转换为数据类型 int 时转换失败。

我的问题是,鉴于 propertyInst 表的表扫描将拾取包括小数在内的所有数值,为什么标量运算符中的隐式转换不会因相同的转换错误而失败?ISNUMERIC 查询的输出返回其中一些小数。我根本看不出所附计划是如何运作的。

隐式转换运算符是否永远不会彻底失败,转换错误是否来自哈希匹配运算符中的探测残差?话又说回来,当隐式转换失败时,该值如何能够到达运算符呢?

作为一个小帮助,计划图像在这里,我要询问的计算标量被圈起来。

计划

此外,我可以看到没有针对标量运算符记录的实际行 - 这是否意味着引擎由于转换错误而决定在运行时不使用该特定运算符?

计划2

任何帮助,将不胜感激。

sql-server execution-plan type-conversion errors sql-server-2014

4
推荐指数
1
解决办法
406
查看次数

此时 SQL Server 会验证数据以进行插入

我有一个查询将数据从一个表插入到另一个表中。源列之一大于目标表的列,但查询中选择的实际数据并非如此。因此,例如,源表是varchar(25),目标表是varchar(10),并且查询为该特定列选择不超过 10 个字符的记录。

我的初始查询因截断错误而失败,但是当我重新编写它时,它选择了相同的记录但更改了 where 子句,即WHERE IN在 cte 上使用和过滤它成功运行。

即而不是做

select * from tbl where col1 = 1
Run Code Online (Sandbox Code Playgroud)

我做了:

with cte as (select 1) select * from tbl where col1 in (select 1 from cte)
Run Code Online (Sandbox Code Playgroud)

我知道这是 SQL Server 中的一个错误,但我仍然想知道 SQL Server 在哪一点验证插入的数据。在哪一点抛出错误?

sql-server insert

4
推荐指数
1
解决办法
247
查看次数

UPDATE语句处理WHERE子句应该消除的记录

我收到一个非常奇怪的错误。考虑下表:

CREATE TABLE #MyTable (
    Key1 INT , Key2 INT ,
    x SMALLINT , y INT , z INT ,
    a FLOAT , b FLOAT , c SMALLINT , s FLOAT
)

-- insert many records

CREATE UNIQUE CLUSTERED INDEX CI ON #MyTable ( Key1 , Key2 )
Run Code Online (Sandbox Code Playgroud)

出于某种原因,以下更新语句尝试除以零。这只能在c=0或 时发生c=1。该WHERE条款明确规定c>1

-- this fails with divide-by-zero error
UPDATE  #MyTable
SET s = CASE
        WHEN a - SQUARE ( b ) / c <= …
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 sql-server update errors

3
推荐指数
1
解决办法
207
查看次数