Ошибка с CTE.Может ли кто-нибудь помочь мне исправить приведенную ниже ошибку - PullRequest
0 голосов
/ 19 сентября 2011

Я пишу ниже функцию, чтобы вернуть суффикс, передавая имя в качестве параметра.Я сделал возможными случаи использования суффикса в имени в качестве общего табличного выражения и пытался сравнить с этим.Может ли кто-нибудь объяснить мне правильный способ сделать это.

  Alter function S (@Name varchar(100))
returns varchar(25)
as 
begin
declare @Suffix varchar(25)
WITH SearchTerms(Term)
     AS (SELECT ' I '
         UNION ALL
         SELECT ' II '
         UNION ALL
         SELECT ' III '
         UNION All
         SELECT ' MD '
          UNION All
         SELECT ' M.D '
          UNION All
         SELECT ' M.D. '
          UNION All
         SELECT ' D.O '
           UNION All
         SELECT ' D.O. '
           UNION All
         SELECT ' DO '
         )  ;

 set @Suffix = (select Term from SearchTerms where Charindex(Term,@Name) > 0)
 return @Suffix

 end

Сообщение об ошибке.

Msg 319, Level 15, State 1, Procedure S, Line 6
Incorrect syntax near the keyword 'with'. If this statement is a common table expression, 
an xmlnamespaces clause or a change tracking context clause, the previous statement must 
be terminated with a semicolon.

1 Ответ

3 голосов
/ 19 сентября 2011

Теперь я вижу, у вас есть точка с запятой в конце вашей декларации CTE. Вы не можете сделать это, так как это завершает утверждение. Попробуйте это:

ALTER FUNCTION dbo.S(@Name varchar(100))
RETURNS VARCHAR(25)
AS
BEGIN
    DECLARE @Suffix VARCHAR(25);

    WITH SearchTerms(Term) AS 
    (
      SELECT ' I '
      UNION ALL SELECT ' II '
      UNION ALL SELECT ' III '
      UNION ALL SELECT ' MD '
      UNION ALL SELECT ' M.D '
      UNION ALL SELECT ' M.D. '
      UNION ALL SELECT ' D.O '
      UNION ALL SELECT ' D.O. '
      UNION ALL SELECT ' DO '
    )
    SELECT @Suffix = Term 
        FROM SearchTerms 
        WHERE CHARINDEX(Term, ' ' + @Name + ' ') > 0;

    RETURN (LTRIM(RTRIM(@Suffix)));
END
GO

РЕДАКТИРОВАТЬ на основе новой информации, вот табличная функция, которая возвращает все результаты:

CREATE FUNCTION dbo.T
(
    @Name VARCHAR(100)
)
RETURNS TABLE
AS
    RETURN
    (
        SELECT 
            Term = CONVERT(VARCHAR(25), LTRIM(RTRIM(Term)))
        FROM
        (
            SELECT Term = ' I '
            UNION ALL SELECT ' II '
            UNION ALL SELECT ' III '
            UNION ALL SELECT ' MD '
            UNION ALL SELECT ' M.D '
            UNION ALL SELECT ' M.D. '
            UNION ALL SELECT ' D.O '
            UNION ALL SELECT ' D.O. '
            UNION ALL SELECT ' DO '
        ) AS Terms
        WHERE CHARINDEX(Term, ' ' + @Name + ' ') > 0
    );
GO

SELECT Term FROM dbo.T('Terry Allen MD III');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...