«Неверный синтаксис» с использованием табличной функции в предложении SELECT запроса T-SQL - PullRequest
2 голосов
/ 24 февраля 2011

У меня есть следующая табличная функция для разделения строк. Это прекрасно работает, было взято из других источников в Интернете, и я бы подумал, что это не является причиной проблемы, но включен в случае, если это актуально:

CREATE FUNCTION dbo.StringSplit (@sep char(1), @s varchar(512))
RETURNS table
AS
RETURN (
  WITH Pieces(pn, start, stop) AS (
    SELECT 1, 1, CHARINDEX(@sep, @s)
    UNION ALL
    SELECT pn + 1, stop + 1, CHARINDEX(@sep, @s, stop + 1)
      FROM Pieces
    WHERE stop > 0
  )
  SELECT pn,
    SUBSTRING(@s, start, CASE WHEN stop > 0 THEN stop-start ELSE 512 END) AS s
  FROM Pieces
)
GO

Включает следующую строку:

SELECT * FROM dbo.StringSplit('.', 'this.is.a.string.to.split')

для производства

 pn | s
----+--------
 1  | this
 2  | is
 3  | a
 4  | string
 5  | to
 6  | split

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

SELECT
  doc_id,
  doc_file_name,
  (SELECT TOP 1 s FROM dbo.StringSplit('.', doc_file_name) ORDER BY pn DESC) AS extension
FROM
  ai_docs_core

Наличие SQL Server Enterprise Manager для проверки синтаксиса, который дает мне синтаксическую ошибку в строке, содержащей функцию:

Msg 102, Level 15, State 1, Line 34
Incorrect syntax near 'doc_file_name'.

Следующее не делает то, что мне нужно (очевидно, потому что он использует переменную set), но это не вызывает синтаксическую ошибку:

DECLARE @foo VARCHAR(512) = 'my_filename.doc'
SELECT
  doc_id,
  doc_file_name,
  (SELECT TOP 1 s FROM dbo.StringSplit('.', @foo) ORDER BY pn DESC) AS extension
FROM
  ai_docs_core

Таким образом, вопрос заключается в следующем: почему использование определенного имени поля в качестве параметра функции вызывает синтаксическую ошибку и как я могу добиться того, чего хочу?

1 Ответ

6 голосов
/ 24 февраля 2011

Я полагаю, что для базы данных установлен режим совместимости 80 или ниже.

См. sp_dbcmptlevel

Обычно это происходит, если это происходит в предложении FROM

Вы также можете написать это так

SELECT
  a.doc_id,
  a.doc_file_name,
  foo.extension 
FROM
  ai_docs_core a
  OUTER APPLY
  (SELECT TOP 1 s AS extension
   FROM dbo.StringSplit('.', a.doc_file_name)
   ORDER BY pn DESC
  ) foo
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...