UDF не найден в инструкции SQL SELECT


Я не могу сосредоточиться на заявлении select UDF, приведенном по ссылке ниже:

Как разделить значение, разделенное запятыми, на столбцы

CREATE FUNCTION dbo.Split (
  @InputString                  VARCHAR(500),
  @Delimiter                    VARCHAR(1)
)

RETURNS @Items TABLE (
  Item                          VARCHAR(500)
)

AS
BEGIN
  IF @Delimiter = ' '
  BEGIN
        SET @Delimiter = ','
        SET @InputString = REPLACE(@InputString, ' ', @Delimiter)
  END

  IF (@Delimiter IS NULL OR @Delimiter = '')
        SET @Delimiter = ','

--INSERT INTO @Items VALUES (@Delimiter) -- Diagnostic
--INSERT INTO @Items VALUES (@InputString) -- Diagnostic

  DECLARE @Item           VARCHAR(500)
  DECLARE @ItemList       VARCHAR(500)
  DECLARE @DelimIndex     INT

  SET @ItemList = @InputString
  SET @DelimIndex = CHARINDEX(@Delimiter, @ItemList, 0)
  WHILE (@DelimIndex != 0)
  BEGIN
        SET @Item = SUBSTRING(@ItemList, 0, @DelimIndex)
        INSERT INTO @Items VALUES (@Item)

        -- Set @ItemList = @ItemList minus one less item
        SET @ItemList = SUBSTRING(@ItemList, @DelimIndex+1, LEN(@ItemList)-@DelimIndex)
        SET @DelimIndex = CHARINDEX(@Delimiter, @ItemList, 0)
  END -- End WHILE

  IF @Item IS NOT NULL -- At least one delimiter was encountered in @InputString
  BEGIN
        SET @Item = @ItemList
        INSERT INTO @Items VALUES (@Item)
  END

  -- No delimiters were encountered in @InputString, so just return @InputString
  ELSE INSERT INTO @Items VALUES (@InputString)

  RETURN

END -- End Function
GO

Я проверил разрешение, а также убедился, что функция была создана в правильной схеме, используя:

SELECT * FROM INFORMATION_SCHEMA.ROUTINES

Однако я столкнулся с проблемой, когда запустил следующее:

select dbo.Split(TargetFolderId, ',') from ReportConfig where ReportId = 9

Ошибка:

Не удается найти ни столбец "dbo", ни определяемую пользователем функцию, ни объединять - ДБО.Раскол", или название неоднозначное.

Но я могу сделать

select * from dbo.Split('stringA,stringB', ',')

Может ли быть разница между версией SSMS, которую мы оба используем?

Я использую SQL2017 - среда SSMS В17.4.

2 3

2 ответа:

Очевидно, что функция определяется как табличное значение, и вы не можете использовать ее таким образом

select dbo.Split(TargetFolderId, ',') from ReportConfig where ReportId = 9

Но вы можете выполнить CROSS APPLY, чтобы получить TargetFolderId разбитые значения.

select sp.Item from ReportConfig rc
CROSS APPLY dbo.Split(rc.TargetFolderId) AS sp
where rc.ReportId = 9

Вот ваш ответ

RETURNS @Items TABLE (
  Item                          VARCHAR(500)
)

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

Select * FROM dbo.Split('1,2,3,4,5,6',',')

Результат

Item
1
2
3
4
5
6