【问题标题】:Convert fractions into decimal in sql using a function and select statements使用函数和选择语句在sql中将分数转换为小数
【发布时间】:2018-02-22 20:50:39
【问题描述】:

每次我尝试在 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"、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

【问题讨论】:

  • 你需要决定是返回数据给客户端还是给变量赋值。
  • 在您考虑这个决定时,您可能想了解一下 NOLOCK。它有很多“好处”,大多数人要么忽略要么不知道。 blogs.sentryone.com/aaronbertrand/bad-habits-nolock-everywhere 我还建议使用别名,这样您的查询就不是一堵文字墙。并且字段列表中的三部分命名已被弃用。
  • 没有。你不能同时做这两件事。错误信息真的再清楚不过了。如果可以做到,您将在这里处理另一个问题。您正在使用标量变量并将值分配给选择查询。您希望变量中选择语句中的哪一行??
  • declare @jamb_depth as varchar - 这是一个大忌!您应该始终为您的varchar - 否则,在这种情况下,您最终会得到一个长度为 恰好一个字符 的变量 - 这通常 不是 您想要的。 总是定义一个长度 - 使用declare @jamb_depth as varchar(100)(或任何有意义的)
  • @marc_s,谢谢你的来信。我对 SQL 很陌生。几乎所有东西都是自学的。以后我一定会记住的。

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


【解决方案1】:

因为你说你对 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-19
    • 1970-01-01
    • 2018-11-12
    • 1970-01-01
    • 2014-03-01
    • 2015-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多