SQL这种语法有什么问题?开始…如果…返回

SQL这种语法有什么问题?开始…如果…返回,sql,tsql,sql-server-2014,Sql,Tsql,Sql Server 2014,下面是一个函数的摘录。我总是遇到语法错误 关键字“RETURN”附近的语法不正确 我的代码: CREATE FUNCTION dbo.convttxt (@mhtztxt VARCHAR(MAX)) RETURNS FLOAT AS BEGIN DECLARE @mhtz FLOAT IF (ISNUMERIC(LTRIM(RTRIM(@mhtztxt))) RETURN CONVERT(FLOAT, LTRIM(RTRIM(@mhtztxt)))

下面是一个函数的摘录。我总是遇到语法错误

关键字“RETURN”附近的语法不正确

我的代码:

CREATE FUNCTION dbo.convttxt (@mhtztxt VARCHAR(MAX))
RETURNS FLOAT
AS
BEGIN
    DECLARE @mhtz FLOAT 

    IF (ISNUMERIC(LTRIM(RTRIM(@mhtztxt)))
        RETURN CONVERT(FLOAT, LTRIM(RTRIM(@mhtztxt))) 

    SET @mhtz = (SELECT 
                     REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE([COL1], 'xyz', 0)              
              ,'<Enter Text Here>', 0)
              ,'<Enter Text Here>', 0)
              ,'<Enter Text Here>', 0)
              ,'<Enter Text Here>', 0)
              ,'<Enter Text Here>', 0)
              ,'<Enter Text Here>', 0)
              ,'<Enter Text Here>', 0) 

                 FROM dbo.table1)

    RETURN @mhtz
END

但替换逻辑仍然缺失-

CREATE FUNCTION dbo.convttxt (@mhtztxt VARCHAR(MAX))
RETURNS FLOAT
AS
BEGIN
    DECLARE @mhtz FLOAT 

    IF ISNUMERIC(LTRIM(RTRIM(@mhtztxt))) = 1 
       SET @mhtz = CONVERT(FLOAT, LTRIM(RTRIM(@mhtztxt))) 
    ELSE
    SELECT @mhtz = 
                     REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(name, 'xyz', 0)              
              ,'<Enter Text Here>', 0)
              ,'<Enter Text Here>', 0)
              ,'<Enter Text Here>', 0)
              ,'<Enter Text Here>', 0)
              ,'<Enter Text Here>', 0)
              ,'<Enter Text Here>', 0)
              ,'<Enter Text Here>', 0) 

                 FROM sys.all_objects
    ;

    RETURN @mhtz
END

这是固定的,但@tgr击败了我

ALTER FUNCTION dbo.convttxt (@mhtztxt VARCHAR(MAX))
RETURNS FLOAT AS
BEGIN
  DECLARE @mhtz FLOAT;
  --below: extra parenthesis removed, variable spelled wrong, ISNUMERIC statement was not complete

  IF ISNUMERIC(ltrim(rtrim(@mhtztxt)))=1 
  --RETURN convert(FLOAT, ltrim(rtrim(@mhtztxt))) 
    SET @mhtz = convert(FLOAT, ltrim(rtrim(@mhtztxt)));
  ELSE
  SET @mhtz= 
    (SELECT TOP(1)
        REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE([COL1] 
                ,'xyz', 0)              
                ,'<Enter Text Here>', 0)
                ,'<Enter Text Here>', 0)
                ,'<Enter Text Here>', 0)
                ,'<Enter Text Here>', 0)
                ,'<Enter Text Here>', 0)
                ,'<Enter Text Here>', 0)
                ,'<Enter Text Here>', 0) 
                from (SELECT 1.00 UNION ALL SELECT 2.00) table1(col1)); -- emulating your table

   RETURN @mhtz;
END -- needed an End
您可以进一步简化此操作,如下所示:

ALTER FUNCTION dbo.convttxt (@mhtztxt VARCHAR(MAX))
RETURNS FLOAT AS
BEGIN
  RETURN
    CASE 
      WHEN ISNUMERIC(ltrim(rtrim(@mhtztxt)))=1 
      THEN convert(FLOAT, ltrim(rtrim(@mhtztxt)))
      ELSE
      (SELECT TOP(1)
          REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE([COL1] 
                  ,'xyz', 0),'<Enter Text Here>', 0),'<Enter Text Here>', 0)
                  ,'<Enter Text Here>', 0),'<Enter Text Here>', 0),'<Enter Text Here>', 0)
                  ,'<Enter Text Here>', 0),'<Enter Text Here>', 0) 
                  from (SELECT 1.00 UNION ALL SELECT 2.00) table1(col1)) -- emulating your table
    END
END

IF语句的括号不匹配。从这里我可以看到。ISNUMERICltrimrtrim@mthztt不平衡括号。4个左括号和3个右括号。如果这是一个问题,那么我投票关闭作为一个简单的印刷错误。你能显示整个功能吗?我只看到3开幕式parenthesis@bill. 在IF语句中有4个。如果****是数字****r**r*****MTHZTSELECTDBO.CONTTXXT 1234 ->这将工作选择DBO.CONTTXXT’ASDF’->这将给您一个转换错误,您应该考虑添加一些错误处理或TyySCAST命令。此外,如果这对您很重要,您不应该在大型查询中使用用户定义的函数,因为查询不会并行执行。CLR可能会做得更好: