У меня есть следующая табличная функция для разделения строк. Это прекрасно работает, было взято из других источников в Интернете, и я бы подумал, что это не является причиной проблемы, но включен в случае, если это актуально:
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
Таким образом, вопрос заключается в следующем: почему использование определенного имени поля в качестве параметра функции вызывает синтаксическую ошибку и как я могу добиться того, чего хочу?