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 ответа:
Очевидно, что функция определяется как табличное значение, и вы не можете использовать ее таким образом
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