使用函数和select语句将sql中的分数转换为十进制

时间:2018-02-22 20:50:39

标签: sql sql-server sql-server-2016

每次尝试在Microsoft SQL Server Management Studio中运行以下内容时,都会收到错误消息

  

为变量赋值的SELECT语句不能与数据检索操作结合使用

总之在一个声明中是否存在?

我在此声明中调用函数的原因(dbo.ufn_ConvertJambDepthFractionToNumber)是因为dbo.CDS_Shipments_Door_Overall_Jamb_Depth.InstructionValue AS [Jamb Depth]列吐出的值如4 1/6",3 1/4&# 34;,6 9/16"。我正在使用该功能尝试将varchar值(4 1/6",3 1/4",6 9/16")转换为小数。

如果有更好的方法可以做到这一点,我全心全意。

use BeechworthProdWTS

declare @jamb_depth as varchar

SELECT DISTINCT 
    dbo.QuoteShippingAddress.Name AS [CDS Location],
    dbo.QuoteShippingAddress.Address1 AS [Quote Shipping Address1], 
    dbo.CDS_Shipments_Door_Overall_Jamb_Depth.InstructionValue AS [Jamb Depth], 
    dbo.CDS_Shipments_Door_Count_view.Doors, 
    dbo.CDS_Shipments_Screen_Count_view.Screens, 
    dbo.CDS_Shipments_Windows_Count_view.Windows, 
    dbo.LineItemMaster.LineNumber,
    @jamb_depth = dbo.CDS_Shipments_Door_Overall_Jamb_Depth.InstructionValue, 
    dbo.ufn_ConvertJambDepthFractionToNumber(@jamb_depth)
FROM   
    dbo.Quotes 
INNER JOIN
    dbo.QuoteShippingAddress WITH (NOLOCK) ON dbo.Quotes.QuoteID = dbo.QuoteShippingAddress.QuoteID 
INNER JOIN
    dbo.Clients WITH (NOLOCK) ON dbo.Quotes.ClientID = dbo.Clients.ClientID 
INNER JOIN
    dbo.CustomerProjectInformation WITH (NOLOCK) ON dbo.Quotes.QuoteID = dbo.CustomerProjectInformation.QuoteID 
INNER JOIN
    dbo.LineItemMaster WITH (NOLOCK) ON dbo.Quotes.QuoteID = dbo.LineItemMaster.QuoteID 
INNER JOIN
    dbo.LineItems WITH (NOLOCK) ON dbo.LineItemMaster.LineItemMasterID = dbo.LineItems.LineItemMasterID 
INNER JOIN
    dbo.WorkOrders WITH (NOLOCK) ON dbo.LineItems.LineItemID = dbo.WorkOrders.LineItemID 
LEFT OUTER JOIN
    dbo.CDS_Shipments_Door_Count_view WITH (NOLOCK) ON dbo.LineItems.LineItemID = dbo.CDS_Shipments_Door_Count_view.LineItemID 
LEFT OUTER JOIN
    dbo.CDS_Shipments_Door_Overall_Jamb_Depth WITH (NOLOCK) ON dbo.LineItems.LineItemID = dbo.CDS_Shipments_Door_Overall_Jamb_Depth.LineItemID 
LEFT OUTER JOIN
    dbo.CDS_Shipments_Screen_Count_view WITH (NOLOCK) ON dbo.LineItems.LineItemID = dbo.CDS_Shipments_Screen_Count_view.LineItemID 
LEFT OUTER JOIN
    dbo.CDS_Shipments_Windows_Count_view WITH (NOLOCK) ON dbo.LineItems.LineItemID = dbo.CDS_Shipments_Windows_Count_view.LineItemID

1 个答案:

答案 0 :(得分:0)

由于你说你对SQL很陌生,所以我使用别名重新格式化了这个,这样你就可以看到它在视觉上有多大区别。这不会影响性能,但它确保了开发人员的理智。另外,不确定你要用标量做什么,但也许试图获得每一行的价值?

清理查询可能看起来像这样。

SELECT DISTINCT 
    qsa.Name AS [CDS Location],
    qsa.Address1 AS [Quote Shipping Address1], 
    sdojd.InstructionValue AS [Jamb Depth], 
    sdcv.Doors, 
    sscv.Screens, 
    swcv.Windows, 
    lim.LineNumber,
    --@jamb_depth = sdojd.InstructionValue, --not really sure what you are trying to do here
    --dbo.ufn_ConvertJambDepthFractionToNumber(@jamb_depth)
    JambDepth = dbo.ufn_ConvertJambDepthFractionToNumber(sdojd.InstructionValue)
FROM dbo.Quotes q
INNER JOIN dbo.QuoteShippingAddress qsa ON q.QuoteID = qsa.QuoteID 
INNER JOIN dbo.Clients c ON q.ClientID = c.ClientID 
INNER JOIN dbo.CustomerProjectInformation cpi ON q.QuoteID = cpi.QuoteID 
INNER JOIN dbo.LineItemMaster lim ON q.QuoteID = lim.QuoteID 
INNER JOIN dbo.LineItems li ON lim.LineItemMasterID = li.LineItemMasterID 
INNER JOIN dbo.WorkOrders wo ON li.LineItemID = wo.LineItemID 
LEFT OUTER JOIN dbo.CDS_Shipments_Door_Count_view sdcv ON li.LineItemID = sdcv.LineItemID 
LEFT OUTER JOIN dbo.CDS_Shipments_Door_Overall_Jamb_Depth sdojd ON li.LineItemID = sdojd.LineItemID 
LEFT OUTER JOIN dbo.CDS_Shipments_Screen_Count_view sscv ON li.LineItemID = sscv.LineItemID 
LEFT OUTER JOIN dbo.CDS_Shipments_Windows_Count_view swcv ON li.LineItemID = swcv.LineItemID
相关问题