我想查看一个日期是否发生在去年,如果是,那么将值增加1.所以我尝试了以下,但它返回以下错误:
消息102,级别15,状态1,过程完成,第41行[批次启动第7行] '@compliant'附近的语法不正确。
码:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER FUNCTION [dbo].[IsComplete] (@input VARCHAR(9))
RETURNS CHAR(1)
AS
BEGIN
DECLARE @idnum VARCHAR(9)
DECLARE @complete CHAR
DECLARE @cert int
DECLARE @compliant int
SET @idnum = SUBSTRING(@input, 0, 9)
SET @compliant = 0
SET @cert = (SELECT DATEDIFF(month, CertifiedDate, GETDATE())
FROM Profile
WHERE IDNumber = @idnum)
BEGIN
IF @cert > 11
BEGIN
@compliant = @compliant + 1
END
ELSE
BEGIN
-- do nothing
END
END
RETURN @complete
END
看起来很简单,但我无法让它工作,因为它会产生错误并且不会编译。有人能指出我正确的方向吗?
根据错误,在函数的第25行,你只是忘了添加SET
。所以改变如下:
SET @compliant = @compliant + 1
SET @compliant = @compliant +
(SELECT
case when DATEDIFF(month, CertifiedDate, GETDATE()) > 11 then 1 else 0 end
FROM Profile
WHERE IDNumber = @idnum)
这是因为你的Else
子句是空的,而SQL不喜欢空子句。
只需删除整个'Else'部分(因为它什么都不做),你的查询应该编译:)
请尝试以下查询:
USE [CDB]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER FUNCTION [dbo].[IsComplete] (@input VARCHAR(9))
RETURNS CHAR(1)
AS BEGIN
DECLARE @idnum VARCHAR(9)
DECLARE @complete CHAR
DECLARE @cert int
DECLARE @compliant int
SET @idnum = SUBSTRING(@input, 0, 9)
SET @compliant = 0
SET @cert = (SELECT DATEDIFF(month, CertifiedDate, GETDATE()) FROM Profile WHERE IDNumber = @idnum)
BEGIN
IF @cert > 11
BEGIN
SET @compliant = @compliant + 1
END
--ELSE
-- BEGIN
-- -- do nothing
-- END
END
RETURN @complete
END
说明:
SET
添加到@compliant = @compliant + 1
行
评论不需要的ELSE
块。看看它是否有效。