查询在create函数上引发新的声明字符串错误

时间:2018-10-12 17:20:53

标签: sql sql-server sql-server-2008

我试图在SQL Server中创建一个函数,但出现此错误:

  

[S0001] [102]'@ string2'附近的语法不正确

在线

DECLARE @string2 VARCHAR(255) = @s;

我创建了许多函数,但从未出现这种错误

已完成

CREATE FUNCTION dbo.GetMeterNumber(@s AS VARCHAR(MAX))
RETURNS VARCHAR(MAX) AS
BEGIN
    IF @s IS NOT NULL
    BEGIN
        DECLARE @string2 VARCHAR(255) = @s;
        @string2 = REPLACE(REPLACE(LEFT(REVERSE(LEFT(REVERSE(@string2), CHARINDEX('/', REVERSE(@string2)) - 1)),
                                      CHARINDEX('-',
                                                REVERSE(
                                                    LEFT(REVERSE(@string2), CHARINDEX('/', REVERSE(@string2)) - 1)))
                                      - 1), 'NUMBER_', ''), '_OF_10', '')
        RETURN @string2
    END
END
GO

2 个答案:

答案 0 :(得分:1)

当我假设您要在其中放置@string2 = ...set时,您就以select开始声明

答案 1 :(得分:1)

变量(@s)的问题,应在BEGIN之前声明,返回应在END之后:

因此,正确的版本应该是:

CREATE FUNCTION dbo.GetMeterNumber(@s AS VARCHAR(MAX))
RETURNS VARCHAR(MAX) AS
BEGIN

DECLARE @string2 VARCHAR(MAX) = @s

  IF @s IS NOT NULL
    BEGIN

      SET @string2 = REPLACE(REPLACE(LEFT(REVERSE(LEFT(REVERSE(@string2), CHARINDEX('/', REVERSE(@string2)) - 1)),
                                      CHARINDEX('-',
                                                REVERSE(
                                                    LEFT(REVERSE(@string2), CHARINDEX('/', REVERSE(@string2)) - 1)))
                                      - 1), 'NUMBER_', ''), '_OF_10', '')

    END

  RETURN @string2
END

编辑:我将在核心loigc中添加一些预防措施:

REPLACE(REPLACE(LEFT(REVERSE(LEFT(REVERSE(@string2), CHARINDEX('/', REVERSE(@string2 + '/')) - 1)),
                                      CHARINDEX('-',
                                                REVERSE(
                                                    LEFT(REVERSE(@string2), CHARINDEX('/', REVERSE(@string2 + '/')) - 1) + '-'))
                                      - 1), 'NUMBER_', ''), '_OF_10', '')