【发布时间】: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