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