Sql server SQL Server内联视图错误?
我使用的是SQL Server 2012,我认为内联视图存在一个非常奇怪的问题 首先,我有一个问题:Sql server SQL Server内联视图错误?,sql-server,Sql Server,我使用的是SQL Server 2012,我认为内联视图存在一个非常奇怪的问题 首先,我有一个问题: select parcelnumber, sectionname, value.Value CalculatedValue, overriddenvalue.Value OverriddenValue, homk.Value CalculatedHomeownersValue, cv.CharacteristicValue, pdt.P
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%'
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
注意where子句中的最后一项。此查询返回0个结果,这将证明不存在包含F的
CharacteristicValue
列的行
现在让我们运行此查询:
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%'
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的行,因此我假设外部查询可以依赖于此
然而,我明白了:
将varchar值“F”转换为数据类型int时,转换失败
我认为唯一可能发生这种情况的方法是忽略pdt.Label='Type',但就我个人而言,我不明白为什么 答案似乎是,由于相关性,内部查询无法在外部查询之前执行。在外部查询中添加筛选器解决了此问题。您的视图筛选器位于:
where year(appraisaldate) = 2016 and CharacteristicValue like '%F%'
这意味着可以有只满足特征值的行,如“%F%”
T-SQL中未指定执行顺序。这是一个问题,当试图保护计算时,可能会抛出一些检查
通常,case。。。当
是可靠的防护装置时。在你的情况下,我看没有理由不这样做。因此,当CharacteristicValue像“%A”而CharacteristicValue不像“%F%”时,可以执行
或者,您可以使用始终安全的TRY\u CONVERT
其中
不是可靠的防护装置。在你的另一个回答中,你写道这是可行的,但这只是巧合。如果使用不同的查询计划,则可能会失败。计划因多种原因而更改。如果将%F%筛选器添加到第二个查询中,是否会返回相同的错误?CharacteristicValue
这是一个INT
数据类型列???请尝试“从CharacteristicValue中选择*,其中CharacteristicValue类似“%F%”,然后查看是否返回任何内容。isnumeric()
是一个糟糕的函数选择,用于检查它是否真的是一个数值,因为对于像123e12
或456d1
这样的值,它将返回true,您应该使用像这样的like运算符,其中CharacteristicValue不象“[^0-9]”
您有很多与多个表的联接,您说过表中有“%F%”的数据,pdt.Lavel和cd.Name会将它们过滤掉。我对此不确定,因为您是通过另一个表加入的。