无法创建 SQL 服务器功能来测试格式

Trouble creating a SQL Server function to test formats

原代码来自本站,不知怎么的,页面丢失了,无法引用。但这里是原始代码:

DECLARE @email_address VARCHAR(2000) = 'aname@acompany.com'

IF (
     CHARINDEX(' ',LTRIM(RTRIM(@email_address))) = 0 
    AND  LEFT(LTRIM(@email_address),1) <> '@' 
    AND  RIGHT(RTRIM(@email_address),1) <> '.' 
    AND  CHARINDEX('.',@email_address ,CHARINDEX('@',@email_address)) - CHARINDEX('@',@email_address ) > 1 
    AND  LEN(LTRIM(RTRIM(@email_address ))) - LEN(REPLACE(LTRIM(RTRIM(@email_address)),'@','')) = 1 
    AND  CHARINDEX('.',REVERSE(LTRIM(RTRIM(@email_address)))) >= 3 
    AND  (CHARINDEX('.@',@email_address ) = 0 AND CHARINDEX('..',@email_address ) = 0)
    )
   print 'valid email address'
ELSE
   print 'not valid'

从那时起,我打算编写一个可以调用的函数来测试格式。考虑到我稍后想用它来测试 Twitter 和其他社交 ID,我想我会让它成为一个接受 sting 以及要测试的格式的代码。

这是我写的:

CREATE FUNCTION [dbo].[TestForType](@strString VARCHAR(2000), @strFormat VARCHAR(2000))

RETURNS BIT
AS
BEGIN
--DECLARE @strString VARCHAR(2000)= 'aname@acompany.com'
DECLARE @email_address VARCHAR(2000)
--DECLARE @strFormat VARCHAR(2000) = 'email'
DECLARE @bitTrueFalse bit
SET @email_address =@strString
--SET @bitTrueFalse = If(@strFormat = 'email') BEGIN
If(@strFormat = 'email') BEGIN
    IF (@email_address <> 'none@pletter.com'
        AND CHARINDEX(' ',LTRIM(RTRIM(@email_address))) = 0 
        AND  LEFT(LTRIM(@email_address),1) <> '@' 
        AND  RIGHT(RTRIM(@email_address),1) <> '.' 
        AND  CHARINDEX('.',@email_address ,CHARINDEX('@',@email_address)) - CHARINDEX('@',@email_address ) > 1 
        AND  LEN(LTRIM(RTRIM(@email_address ))) - LEN(REPLACE(LTRIM(RTRIM(@email_address)),'@','')) = 1 
        AND  CHARINDEX('.',REVERSE(LTRIM(RTRIM(@email_address)))) >= 3 
        AND  (CHARINDEX('.@',@email_address ) = 0 AND CHARINDEX('..',@email_address ) = 0)
        )

            SET @bitTrueFalse =  1

    ELSE 
        SET @bitTrueFalse =  0
    END --END IF
ELSE
    SET @bitTrueFalse =  NULL
END --End IF
RETURN @bitTrueFalse    

我收到这个错误:

Msg 156, Level 15, State 1, Procedure TestForType, Line 41
Incorrect syntax near the keyword 'RETURN'.

我不明白。我想要它 return 的值 @bitTrueFalse.

你最里面的 IF 没有 BEGIN,所以基本上你的 END 是不平衡的。

RETURN 之前的 END 属于第一个 BEGIN(就在 AS 之后),因此,您的 RETURN在函数代码结束之后。把你的 RETURN 放在最后 之前 END 你应该没问题

你的代码真的看起来像这样:

CREATE FUNCTION [dbo].[TestForType]
    (@strString VARCHAR(2000), @strFormat VARCHAR(2000))
RETURNS BIT
AS
BEGIN -- (1)
    DECLARE @email_address VARCHAR(2000)
    DECLARE @bitTrueFalse bit

    SET @email_address = @strString

    IF (@strFormat = 'email') BEGIN   -- (2)
       IF (@email_address <> 'none@pletter.com'
          AND CHARINDEX(' ', LTRIM(RTRIM(@email_address))) = 0 
          .... all those other conditions ......

          SET @bitTrueFalse =  1   -- no BEGIN here....
       ELSE 
          SET @bitTrueFalse =  0
    END -- END IF (2)
    ELSE
        SET @bitTrueFalse =  NULL
END --- (1)

-- this ends up being *AFTER* the last END 
RETURN @bitTrueFalse