Пользовательская функция в запросе SQLServer не работает - PullRequest
1 голос
/ 30 января 2020

Я создал UDF для разделения текста на столбцы в SQLServer AS

CREATE FUNCTION dbo.fn_Split50
(   
    @str varchar(max),
    @delim char(1), 
    @columnCnt int = 50
)
RETURNS TABLE 
AS
RETURN 
( SELECT * 
    FROM (SELECT 
            nn = (nn - 1) / @columnCnt + 1, 
            nnn = 'value' + cast(((nn - 1) % @columnCnt) + 1 as varchar(10)), 
            value
        FROM (SELECT 
            nn = ROW_NUMBER() over (order by (select null)),
            value
            FROM string_split(@str, @delim) aa
            ) aa
        where nn > 0
    ) bb
    PIVOT  
    (  
    max(value) 
    FOR nnn IN (    
        value1, value2, value3, value4, value5, value6, value7, value8, value9, value10,
        value11, value12, value13, value14, value15, value16, value17, value18, value19, value20,
        value21, value22, value23, value24, value25, value26, value27, value28, value29, value30,
        value31, value32, value33, value34, value35, value36, value37, value38, value39, value40,
        value41, value42, value43, value44, value45, value46, value47, value48, value49, value50        
     )  
    ) AS PivotTable 
)

Когда я тестировал его с жестко закодированной строкой, он отлично работает

SELECT * FROM  dbo.fn_split50('Cate,Robert Anderson, Mary Jame williams' ,   ',', DEFAULT)

Однако, когда я использую его в запрос выдает ошибку

CREATE TABLE #Data (Cols varchar(120))
INSERT INTO #Data VALUES
('James Ray,Mark will'),
('Cate,Robert Anderson, Maryy Jame williams'),
('Johnson Author, Carson')

 SELECT 
  dbo.fn_Split50(Cols, ',', DEFAULT)
 FROM  #Data 

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

Msg 4121, Level 16, State 1, Line 14
Cannot find either column "dbo" or the user-defined function or aggregate "dbo.fn_Split50", or the name is ambiguous.

Что-то я делаю не так?

1 Ответ

3 голосов
/ 30 января 2020

Табличная функция возвращает таблицу. Таким образом, так же, как вы это делали в первом случае, когда это работало, вы должны поместить вызов функции после FROM. Во втором случае происходит сбой, поскольку таблица не является столбцом / выражением, которое должно быть помещено после SELECT.

Возможно, вы сделали это, потому что ваша таблица #Data предоставляет аргументы функции. Способ сделать это - CROSS APPLY:

CREATE TABLE #Data (Cols varchar(120))
INSERT INTO #Data VALUES
('James Ray,Mark will'),
('Cate,Robert Anderson, Maryy Jame williams'),
('Johnson Author, Carson')

 SELECT f.*
 FROM  #Data 
 cross apply dbo.fn_Split50(#Data.Cols, ',', DEFAULT) as f
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...