gpt4 book ai didi

sql-server - SQL Server 内联 View 错误?

转载 作者:行者123 更新时间:2023-12-05 00:54:23 26 4
gpt4 key购买 nike

我正在使用 SQL Server 2012,我认为内联 View 存在一个非常奇怪的问题。

首先,我有这个查询:

select 
parcelnumber,
sectionname,
value.Value CalculatedValue,
overriddenvalue.Value OverriddenValue,
homk.Value CalculatedHomeownersValue,
cv.CharacteristicValue,
pdt.PropertyDataTypeID
from landsections ls
join lands l
on ls.landid = ls.landid
join parcels p
on l.ParcelID = p.ParcelID
join CharacteristicValueGroups cvg
on cvg.ParcelObjectID = ls.ParcelObjectID
join CharacteristicValues cv
on cvg.CharacteristicValueGroupID = cv.CharacteristicValueGroupID
join Characteristics c
on cv.CharacteristicID = c.CharacteristicID
join CharacteristicDetails cd
on c.CharacteristicDetailsID = cd.CharacteristicDetailsID
and cd.name = '09 Composite Adjustment'
join PropertyDataTypes pdt
on cv.PropertyDataTypeID = pdt.PropertyDataTypeID
and pdt.Label = 'Type'
join parcelobjectvalues value
on value.ParcelObjectID = ls.ParcelObjectID
and value.valuetype = 'CalculatedAdjustedValue'
left join parcelobjectvalues overriddenvalue
on overriddenvalue.ParcelObjectID = ls.ParcelObjectID
and overriddenvalue.valuetype = 'OverriddenValue'
join parcelobjectvalues homk
on homk.ParcelObjectID = ls.ParcelObjectID
and homk.valuetype = 'CalculatedHomeownersValue'
where year(appraisaldate) = 2016
and CharacteristicValue like '%F%'

注意 where 子句中的最后一项。此查询返回 0 个结果,这应该证明没有行的 CharacteristicValue 列包含 F。

现在让我们运行这个查询:

select *
from
(
select
*,
case
when CharacteristicValue like '%A' then convert(int, substring(characteristicvalue, 1, len(characteristicvalue) - 1))
when CharacteristicValue like '%K' then convert(int, substring(characteristicvalue, 1, len(characteristicvalue) - 1))
when isnumeric(CharacteristicValue) = 1 then convert(int, characteristicvalue)
else 0
end Quantity
from
(
select
parcelnumber,
sectionname,
value.Value CalculatedValue,
overriddenvalue.Value OverriddenValue,
homk.Value CalculatedHomeownersValue,
cv.CharacteristicValue,
pdt.PropertyDataTypeID
from
landsections ls
join lands l on ls.landid = ls.landid
join parcels p on l.ParcelID = p.ParcelID
join CharacteristicValueGroups cvg on cvg.ParcelObjectID = ls.ParcelObjectID
join CharacteristicValues cv on cvg.CharacteristicValueGroupID = cv.CharacteristicValueGroupID
join Characteristics c on cv.CharacteristicID = c.CharacteristicID
join CharacteristicDetails cd on c.CharacteristicDetailsID = cd.CharacteristicDetailsID and cd.name = '09 Composite Adjustment'
join PropertyDataTypes pdt on cv.PropertyDataTypeID = pdt.PropertyDataTypeID and pdt.Label = 'Type'
join parcelobjectvalues value on value.ParcelObjectID = ls.ParcelObjectID and value.valuetype = 'CalculatedAdjustedValue'
left join parcelobjectvalues overriddenvalue on overriddenvalue.ParcelObjectID = ls.ParcelObjectID and overriddenvalue.valuetype = 'OverriddenValue'
join parcelobjectvalues homk on homk.ParcelObjectID = ls.ParcelObjectID and homk.valuetype = 'CalculatedHomeownersValue'
where
year(appraisaldate) = 2016
) Tbl
) Tbl2
where
CharacteristicValue like '%A' and Quantity > 10

请注意,我已经删除了 %F% 检查。由于第一个查询证明 CharacteristicValue 列中没有带 F 的行,因此我假设外部查询可以依赖于此。

但是,我明白了:

Conversion failed when converting the varchar value 'F' to data type int.

我认为这可能发生的唯一方法是忽略 pdt.Label = 'Type',但对于我来说,我无法理解为什么。

最佳答案

您的 View 过滤条件:

where year(appraisaldate) = 2016 and CharacteristicValue like '%F%'

这意味着可能存在仅满足 CharacteristicValue like '%F%' 的行。

T-SQL 中未指定执行顺序。当试图保护可能会通过某些检查抛出的计算时,这是一个问题。

通常,case ... when 是一个可靠的守卫。我看不出有什么理由不适合你的情况。所以您可以当 CharacteristicValue 像 '%A' 而 CharacteristicValue 不像 '%F%' 时

或者,您可以使用始终安全的 TRY_CONVERT

哪里 不是 可靠的守卫。在您发布的另一个答案中,这可行,但这只是巧合。使用不同的查询计划,这可能会失败。计划因多种原因而改变。

关于sql-server - SQL Server 内联 View 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32382829/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com