带有和不带有 SELECT 关键字的 UPDATE 语句

0 sql-server-2005 sql-server t-sql update

我一直在做一些关于SELECT从这个更新中删除关键字的测试:

Update  #tmpDriverTime
Set     WorkDay2 = (Select IsNull(Sum(PyblHrs),0)
From    spr_DriverTimeEntry
Where   spr_DriverTimeEntry.DrvrID = #tmpDriverTime.EmployeeNo
And     Convert(Varchar(12),dtwrkd,112) = Convert(Varchar(12),@StartDate_1,112))
Run Code Online (Sandbox Code Playgroud)

从我所做的测试来看,无论是否有SELECT关键字,都返回了相同的数据。我由我们的 DBA 运行代码以获得他删除SELECT语句的批准,他说我不能,因为删除SELECT语句会导致更新以不同的方式工作,但他无法阐明它的工作方式有何不同。我已经对新的进行了一些搜索,并找到了一些 MSDN 页面,他们在其中运行UPDATE FROM没有SELECT关键字的命令。所以现在我很困惑,我在 MSDN 上找到的测试和其他示例说我可以删除SELECT关键字,但我的 DBA 说不。删除SELECT关键字是否会影响UPDATE FROM工作方式,如果会,它会如何影响它?

Aar*_*and 6

就我个人而言,我会用以下方式重写它,以清楚地分离源和目标,而不是使用这种子查询分配技术。当然,我正在假设其中一些列的来源,因为您没有使用别名,因此引用不明确。

DECLARE @sd DATETIME;
SET @sd = DATEADD(DAY, DATEDIFF(DAY, 0, @StartDate_1), 0);

;WITH hrs(DrvrID, ph) AS 
(
  SELECT EmployeeNo, SUM(PyblHrs)
    FROM #tmpDriverTime
    GROUP BY EmployeeNo
)
UPDATE e
  -- "WorkDay2" represents a sum of payable hours? Quaint.
  SET WorkDay2 = COALESCE(hrs.ph, 0)
  FROM hrs
  INNER JOIN dbo.spr_DriverTimeEntry AS e -- schema prefix always, please
  ON hrs.DrvrID = e.DrvrID
  -- please don't convert both sides to a string
  -- use a range, then you can still use an index:
  WHERE e.dtwrkd >= @sd
    AND e.dtwrkd <  DATEADD(DAY, 1, @sd);
Run Code Online (Sandbox Code Playgroud)