【问题标题】:Error converting data type varchar to float when using Top clause in sql query在 sql 查询中使用 Top 子句时将数据类型 varchar 转换为 float 时出错
【发布时间】:2014-09-14 07:14:33
【问题描述】:

为什么当我在查询中使用 top 子句时出现转换错误,但当我在查询中使用 select * 时一切正常。

我使用 SQL Server 2000

我使用从下面的代码创建的视图

select sum(g.qty) as qty,g.PartCode,g.PartName,g.arz,g.t,g.OrdNo,max(g.id) as id,g.Val from
        (SELECT sum(iv.FinalQty) AS qty, p.PartCode, p.PartName, CAST(RIGHT(p.PartCode, 4) AS float) AS arz,case when isnumeric(LEFT(RIGHT(p.PartCode, 7), 3))=1 then CAST(LEFT(RIGHT(p.PartCode, 7), 3) AS float) / 100 else CAST(LEFT(RIGHT(p.PartCode, 7), 4) AS float)/100 end AS t, ord.OrdNo, 
                              id.id,ctrl.val
        FROM         INV.InvVchHdr AS hv WITH (nolock) INNER JOIN
                              INV.InvVchItm AS iv WITH (nolock) ON hv.VchHdrID = iv.VchHdrRef INNER JOIN
                              inv.Part p WITH (nolock) ON p.Serial = iv.PartRef INNER JOIN
                              INV.InvRqstItm AS i WITH (nolock) ON i.RqstItmID = iv.RefNum INNER JOIN
                              INV.InvRqstHdr AS h WITH (nolock) ON h.RqstHdrID = i.HdrRef INNER JOIN
                              PRD.PrdOrdPlan AS po WITH (nolock) ON po.OrdPlnId = h.OrdPlnBase INNER JOIN
                              PRD.PrdOrdItem AS oi WITH (nolock) ON oi.OrdItmId = po.OrdItmRef INNER JOIN
                              PRD.PrdOrder AS ord WITH (nolock) ON ord.OrdID = oi.OrderRef JOIN
                              inv.InvVchItmCtrl ctrl WITH (nolock) ON ctrl.VchItmRef = iv.VchItmID
                              join USR.idgen_coil_trace id WITH (nolock) on id.vchitmid=iv.VchItmID
        WHERE     (hv.VchType = 51)  AND (iv.BaseVchType <> 0) and iv.VchItmID>981336159 
        and isnumeric(LEFT(RIGHT(p.PartCode, 7), 3))=1
        AND hv.VchHdrID IN
                                  (SELECT     max(i.vchhdrref)
                                     FROM         inv.InvVchItm i WITH (nolock) JOIN
                                                           inv.InvVchItmCtrl c WITH (nolock) ON c.VchItmRef = i.VchItmID
                                     WHERE     i.VchType = 51
                                     GROUP BY i.PartRef, c.Val)
        GROUP BY p.PartCode, p.PartName, CAST(RIGHT(p.PartCode, 4) AS float)
        , CAST(LEFT(RIGHT(p.PartCode, 7), 3) AS float) / 100
        , ord.OrdNo, ctrl.Val,id.id) g
        --join USR.idgen_coil_trace id on id.vchitmid=g.VchItmID 
        group by g.PartCode, g.PartName, g.arz
        , g.t, g.OrdNo, g.Val


        UNION 
        select sum(g.qty),g.PartCode,g.PartName,g.SizeW,g.SizeH,g.OrdNo,max(g.id),g.Val from(SELECT     sum(iv.FinalQty) AS qty, p.PartCode, p.PartName, cp.SizeW, cp.Sizeh, ord.OrdNo,id.id, ctrl.val
        FROM         INV.InvVchHdr AS hv WITH (nolock) INNER JOIN
                              INV.InvVchItm AS iv WITH (nolock) ON hv.VchHdrID = iv.VchHdrRef INNER JOIN
                              INV.Part AS p WITH (nolock) ON p.Serial = iv.PartRef INNER JOIN
                              INV.InvRqstItm AS i WITH (nolock) ON i.RqstItmID = iv.RefNum INNER JOIN
                              INV.InvRqstHdr AS h WITH (nolock) ON h.RqstHdrID = i.HdrRef INNER JOIN
                              PRD.PrdOrdPlan AS po WITH (nolock) ON po.OrdPlnId = h.OrdPlnBase INNER JOIN
                              PRD.PrdOrdItem AS oi WITH (nolock) ON oi.OrdItmId = po.OrdItmRef INNER JOIN
                              PRD.PrdOrder AS ord WITH (nolock) ON ord.OrdID = oi.OrderRef JOIN
                              inv.InvVchItmCtrl ctrl WITH (nolock) ON ctrl.VchItmRef = iv.VchItmID JOIN
                              inv.PartCmplmnt cp WITH (nolock) ON cp.PartRef = p.Serial
                               join USR.idgen_coil_trace id WITH (nolock) on id.vchitmid=iv.VchItmID
        WHERE     (hv.VchType = 57)  AND (iv.BaseVchType <> 0) and iv.VchItmID>981336159 
         AND PO.PartRef IN (SELECT SERIAL FROM INV.Part P WHERE P.PartName LIKE '%لاف%')
        GROUP BY p.PartCode, p.PartName, cp.SizeW, cp.Sizeh, ord.OrdNo,id.id, ctrl.Val)g
        --join USR.idgen_coil_trace id on id.vchitmid=g.VchItmID 
        group by g.PartCode, g.PartName, g.SizeW
        , g.SizeH, g.OrdNo, g.Val

        UNION  
        --SELECT     *FROM         usr.aghili WITH (nolock)
        --UNION
        --SELECT     *
        --FROM         usr.moradi WITH (nolock)
        SELECT   qty, PartCode, PartName, arz, t, OrdNo, id, val FROM USR.COIL_TRACE_BAK  WITH (nolock)
        union 
        select   qty,PartCode,PartName,arz,t,OrdNo,id,Val from usr.unregister_coil_trace WITH (nolock)

这个查询是正确的 > select * from usr.coil_trace

这个查询不正确 > select top 100 * from usr.coil_trace

【问题讨论】:

  • 您可以将查询与表架构共享吗?
  • 请同时显示您正在使用的查询,以及您收到的准确且完整的错误消息
  • 请帮助我这是 SQL 2000 中的错误吗?
  • 如果您不发布任何有用的信息,谁能提供帮助?
  • 不,我认为 sql server 2000 中没有这样的错误

标签: tsql sql-server-2000


【解决方案1】:

top 子句应该可以在 sql server 2000 中使用。 虽然我没有 sql 2000,但 this link 应该可以帮助你。

还可以查看this stackover flow link的答案

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多