Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.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 Server内联视图错误?_Sql Server - Fatal编程技术网

Sql server SQL Server内联视图错误?

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

我使用的是SQL Server 2012,我认为内联视图存在一个非常奇怪的问题

首先,我有一个问题:

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会将它们过滤掉。我对此不确定,因为您是通过另一个表加入的。