无法创建 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
原代码来自本站,不知怎么的,页面丢失了,无法引用。但这里是原始代码:
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