SQL查询奇数行为:使用两个变量执行时永不结束

SQL查询奇数行为:使用两个变量执行时永不结束,sql,sql-server,Sql,Sql Server,我一直在对一个SQL存储过程进行故障排除,该存储过程一直挂起并且没有完成执行。我将问题简化为声明的两个变量。下面显示的SQL查询是存储过程的一个片段。下面是我执行的测试用例场景 将WHERE子句中的@startver和@endver替换为56,它起作用了。查询在不到一秒钟内完成 将WHERE子句中的@endver替换为@饥饿者,它成功了。查询在不到一秒钟内完成 在WHERE子句中将@饥饿者替换为@endver,它起了作用。查询在不到一秒钟内完成 当这两个变量放在一起时,它不起作用。它一直在显

我一直在对一个SQL存储过程进行故障排除,该存储过程一直挂起并且没有完成执行。我将问题简化为声明的两个变量。下面显示的SQL查询是存储过程的一个片段。下面是我执行的测试用例场景

  • 将WHERE子句中的@startver和@endver替换为56,它起作用了。查询在不到一秒钟内完成
  • 将WHERE子句中的@endver替换为@饥饿者,它成功了。查询在不到一秒钟内完成
  • 在WHERE子句中将@饥饿者替换为@endver,它起了作用。查询在不到一秒钟内完成
当这两个变量放在一起时,它不起作用。它一直在显示

正在执行查询

有人知道为什么会这样吗?我怎样才能解决这个问题?我无法调试它,因为SQL实例位于AWS中,并且我没有系统管理员帐户

DECLARE @startver int = 56, @endver int = 56

SELECT 
    Z_Prodver.ProdverID ProdverID,
    Prod.ProdName,
    Z_Prodver.Releasedver,
    Z_DNameLen.Z_DName Z_DName,
    Z_DItemOffsets.Offset DItemOffset,
    Z_DNameLen.Offset DNameIndex,
    (Z_FormType.storagesize * M.ASize * DItem.ASize * 
        CASE DType.grouped
            WHEN 0 THEN 1
            ELSE 8
        END
    ) AllocationSize,
    H_NAME()
FROM
    Z_Prodver,
    Prod,
    DItem,
    DType,
    M,
    Z_DNameLen,
    Z_DItemOffsets,
    ProdPerM,
    Z_ProdSupport,
    Form,
    Z_FormType
WHERE
    DItem.ProdverID >= @startver
    AND DItem.ProdverID <= @endver
    AND DItem.DName = Z_DNameLen.DName
    AND DType.DTypeName = DItem.DTypeName
    AND DType.ProdverID = DItem.ProdverID
    AND M.MName = DItem.MName
    AND M.ProdverID = DItem.ProdverID
    AND M.MName = ProdPerM.MName
    AND M.ProdverID = ProdPerM.ProdverID
    AND ProdPerM.ProdverID = Z_Prodver.ProdverID
    AND Z_DItemOffsets.ProdverID = Z_Prodver.ProdverID
    AND Prod.ProdName = ProdperM.ProdName
    AND Z_DItemOffsets.DName = DItem.DName
    AND Form.FormName = DItem.FormName
    AND Z_FormType.FormTypeName = Form.FormTypeName
    AND Form.ProdverID = DItem.ProdverID
    AND Z_DItemOffsets.HostName = H_NAME()
    AND Z_ProdSupport.ProdverID = M.ProdverID
    AND Z_ProdSupport.ProdName= Prod.ProdName
    AND Z_ProdSupport.PCSupport = 1
声明@startver int=56,@endver int=56
挑选
这是一个很好的例子,
Prod.ProdName,
Z_Prodver.Releasedver,
Z_DNameLen.Z_DName Z_DName,
Z_ditemofset.Offset ditemofset,
Z_DNameLen.Offset DNameLen索引,
(Z_FormType.storagesize*M.ASize*DItem.ASize*
CASE DType.grouped
当0时,则为1
其他8
结束
)分配,
H_NAME()
从…起
Z_Prodver,
戳
迪特姆,
数据类型,
M
Z_DNameLen,
Z_Ditemofsets,
前胚乳,
Z_ProdSupport,
形式,
Z_型
哪里
DItem.ProdverID>=@startver
和DItem.ProdverID=@startversion
和DataItem.ProductVersionID
但是整个查询需要使用适当的连接进行重写,使用上述解决方法将从
选项(重新编译)
或转换为使用动态sql中获益匪浅

参考:


今日提示:切换到现代的显式
JOIN
语法!更易于编写(无错误),更易于阅读和维护,并且在需要时更易于转换为外部联接。(1)修复查询以使用正确的显式
join
语法。(2) 请尝试存储过程中的“重新编译”选项。问题可能是执行计划的缓存。这不是问题的答案,但您确实应该使用ANSI-92样式的连接。他们已经存在超过25年了。尝试在存储过程中使用“重新编译”。存储过程尝试使用的计划可能不是最有效的。3条评论也这么说-几秒钟之内!(我打败了快速输入Gordon!)这个存储过程是在2002年编写的。我会重新写一遍,看看进展如何。非常感谢。@JC203很乐意帮忙!
    DECLARE @startversion int = 56, @endversion int = 56

SELECT 
    PC_ProductVersion.ProductVersionID AS ProductVersionID,
    Product.ProductName,
    PC_ProductVersion.ReleasedVersion,
    PC_DataNameLengths.PC_DataName AS PC_DataName,
    PC_DataItemOffsets.Offset AS DataItemOffset,
    PC_DataNameLengths.Offset AS ataNameIndex,
    (PC_FormatType.storagesize * Module.ArraySize * DataItem.ArraySize * 
        CASE DataType.grouped
            WHEN 0 THEN 1
            ELSE 8
        END
    ) AllocationSize,
    HOST_NAME()
FROM DataItem 
INNER JOIN PC_DataNameLengths 
    ON DataItem.DataName = PC_DataNameLengths.DataName 
INNER JOIN DataType
    ON DataType.DataTypeName = DataItem.DataTypeName 
    AND DataType.ProductVersionID = DataItem.ProductVersionID
INNER JOIN Module
    ON Module.ModuleName = DataItem.ModuleName 
    AND Module.ProductVersionID = DataItem.ProductVersionID
INNER JOIN ProductPerModule
    ON  ProductPerModule.ProductVersionID = Module.ProductVersionID 
    AND ProductPerModule.ModuleName = Module.ModuleName
INNER JOIN PC_DataItemOffsets
    ON PC_DataItemOffsets.DataName = DataItem.DataName
    AND PC_DataItemOffsets.HostName = HOST_NAME()
INNER JOIN PC_ProductVersion
    ON PC_ProductVersion.ProductVersionID = PC_DataItemOffsets.ProductVersionID
    AND PC_ProductVersion.ProductVersionID = ProductPerModule.ProductVersionID 
INNER JOIN Product
    ON Product.ProductName = ProductperModule.ProductName
INNER JOIN Format
    ON Format.FormatName = DataItem.FormatName
    AND Format.ProductVersionID = DataItem.ProductVersionID
INNER JOIN PC_ProductSupport
    ON PC_ProductSupport.ProductVersionID = Module.ProductVersionID
    AND PC_ProductSupport.ProductName= Product.ProductName
    AND PC_ProductSupport.PCSupport = 1
INNER JOIN PC_FormatType
    ON PC_FormatType.FormatTypeName = Format.FormatTypeName

WHERE
    DataItem.ProductVersionID >= @startversion
    AND DataItem.ProductVersionID <= @endversion
DItem.ProdverID >= @startver AND DItem.ProdverID <= @endver
and 1 = case when @startver = @endver and DItem.ProdverID <> @startver 
        then 0 
      else 1 
      end