Sql server 子查询返回了多个值,不知道这是如何发生的

Sql server 子查询返回了多个值,不知道这是如何发生的,sql-server,Sql Server,我知道错误很明显,但我似乎无法找到为什么它会返回多于1个结果,我做错了什么 我想知道今年一个项目的开始日期还有多少周。因此,我用datediff计算startdate和enddate之间的周差。在确保两个日期都在今年之后。我已经检查了许多其他问题,但找不到类似的问题,因为datedif只返回1个值。提前谢谢 CREATE FUNCTION [dbo].[fWksInCurrentYr] (@projectId int) RETURNS int AS BEGIN -- Declare t

我知道错误很明显,但我似乎无法找到为什么它会返回多于1个结果,我做错了什么

我想知道今年一个项目的开始日期还有多少周。因此,我用datediff计算startdate和enddate之间的周差。在确保两个日期都在今年之后。我已经检查了许多其他问题,但找不到类似的问题,因为datedif只返回1个值。提前谢谢

CREATE FUNCTION [dbo].[fWksInCurrentYr] (@projectId int)

RETURNS int
AS
BEGIN
    -- Declare the return variable here
DECLARE @sDateCY DateTime
DECLARE @eDateCY DateTime
DECLARE @startCY DateTime
DECLARE @endCY DateTime
DECLARE @returnvalue int

SET     @startCY = DATEADD(yy, DATEDIFF(yy,0,getdate()), 0)
SET     @endCY = DATEADD(yy, DATEDIFF(yy,0,getdate()) + 1, -1)
SET     @sDateCY = (SELECT ServiceRequest.StartDate FROM dbo.ServiceRequest WHERE dbo.ServiceRequest.[Project_ID] = @projectId)
SET     @eDateCY = (SELECT ServiceRequest.EndDate FROM dbo.ServiceRequest WHERE dbo.ServiceRequest.[Project_ID] = @projectId)

SET     @sDateCY = CASE 
            WHEN @sDateCY < @startCY THEN @startCY
            ELSE @sDateCY
            END
SET     @eDateCY = CASE
            WHEN @eDateCY > @endCY THEN @endCY
            ELSE @eDateCY
            END

SELECT TOP 1 @returnvalue=IsNull(datediff(ww,@sDateCY,@eDateCY),0)
RETURN @returnvalue

END
如果使用此查询,则会出现以下错误: 选择[dbo].[FWKSIRENTYR][Project].[ID] 从[项目]更改以下内容:

SET     @sDateCY = (SELECT TOP 1 ServiceRequest.StartDate FROM dbo.ServiceRequest WHERE dbo.ServiceRequest.[Project_ID] = @projectId)
SET     @eDateCY = (SELECT TOP 1 ServiceRequest.EndDate FROM dbo.ServiceRequest WHERE dbo.ServiceRequest.[Project_ID] = @projectId)
或者你可以写得更优雅一些,像这样

SELECT TOP 1 @sDateCY = ServiceRequest.StartDate  
            ,@eDateCY = ServiceRequest.EndDate 
FROM dbo.ServiceRequest 
WHERE dbo.ServiceRequest.[Project_ID] = @projectId

您不能从查询返回数据并同时将值分配给变量,但您可以同时将值分配给多个变量,就像我在建议的解决方案中所做的那样。

    SET     @sDateCY = (SELECT ServiceRequest.StartDate FROM dbo.ServiceRequest 
WHERE dbo.ServiceRequest.[Project_ID] = @projectId)
试试这个,而不是这个

    SELECT  @sDateCY = ServiceRequest.StartDate FROM dbo.ServiceRequest 
WHERE dbo.ServiceRequest.[Project_ID] = @projectId
@eDateCY变量也是如此


可能可以解决您的问题,但不确定它是否有效。

运行此查询通过[Project\u ID]选择count*>1,从dbo.ServiceRequest组中选择Project\u ID,count*。所有具有多个记录的项目ID都将导致此问题。在选择startdate和enddate时,可能会尝试添加distinct,看看这是否解决了该问题。但是使用distinct不能保证将来不会收到此错误。非常感谢,这确实是问题所在,我现在已经更改了它。这不会产生任何影响difference@M.Ali:当然会。@Arvo这两种说法有什么不同?@M.Ali,第一个是ANSI标准,如果返回0或多行,则会给出一个错误。第二个是SqlServer扩展,使用返回的最后一个值,如果没有返回行,则不更改@sDateCY。也就是说,如果你想隐藏错误并使调试更加困难,那么第二种方法是很好的:-天哪,你从哪里得到这些信息的?如果select语句未返回任何行,则第一个语句将返回错误,而第二个语句不会返回错误?真正地你能证明这一点吗?根据您的需求,您可能需要minstartdate和maxenddate而不是Top1