2015-03-03 39 views
0

原始代码来自本网站,但不知何故,页面丢失,所以我不能引用它。但这里是原始代码:无法创建SQL Server函数来测试格式

DECLARE @email_address VARCHAR(2000) = '[email protected]' 

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 protected]',@email_address) = 0 AND CHARINDEX('..',@email_address) = 0) 
    ) 
    print 'valid email address' 
ELSE 
    print 'not valid' 

从那以后,我打算写一个函数,我可以调用测试格式。想象我想稍后使用它来测试Twitter和其他社交ID,我想我会让它成为接受刺痛以及测试格式的代码。

这里是我写的:

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

RETURNS BIT 
AS 
BEGIN 
--DECLARE @strString VARCHAR(2000)= '[email protected]' 
DECLARE @email_address VARCHAR(2000) 
--DECLARE @strFormat VARCHAR(2000) = 'email' 
DECLARE @bitTrueFalse bit 
SET @email_address [email protected] 
--SET @bitTrueFalse = If(@strFormat = 'email') BEGIN 
If(@strFormat = 'email') BEGIN 
    IF (@email_address <> '[email protected]' 
     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 protected]',@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'.

我不明白。我希望它返回@bitTrueFalse的值。

+0

请阅读[如何对提问](HTTP://计算器。 com/help/how-to-ask)为标题提供建议。请包括该语言(最好作为标签)。 – adamdc78 2015-03-03 00:25:29

+0

“RETURN”(刚开始时关闭“BEGIN”)后,你缺少另一个'END' – 2015-03-03 06:02:23

+0

一年多加晚了,表示感谢,但我感谢你。我不能给予attaboy分,但是,否则我会的。 – 2016-05-05 16:51:18

回答

0

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

END只是RETURN之前是属于第一个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 <> '[email protected]' 
      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