Я хочу, чтобы моя функция возвращала таблицу, содержащую числа внутри # - PullRequest
0 голосов
/ 04 июля 2019

Я получаю следующую ошибку:

Сообщение 208, уровень 16, состояние 6, процедура fnToken, строка 24Неверное имя объекта 'dbo.fnToken'.

Я попытался вернуть все числа ..

select dbo.fnToken('#254#251451#')
ALTER FUNCTION dbo.fnToken
(   
@Token varchar(100)
)
RETURNS @Listenum TABLE(num varchar(50))
AS
begin
declare @compt int
declare @num varchar(50)
set @compt = 1
while  SUBSTRING(@token,@compt,1)<>''
    begin
        if SUBSTRING(@Token,@compt+1,@compt)<>'#'
            begin
                set @num= @num+SUBSTRING(@Token,@compt+1,1)
                set @compt=@compt+1
            end
        else 
            begin
                Insert  into @Listenum(num) values(@num)

            end 
    end 
Return (SELECT num FROM @Listenum)

ENd 

Это ожидаемый результат:

254

251451

Ответы [ 3 ]

1 голос
/ 04 июля 2019

Вы можете попробовать:

SELECT  value
  FROM  STRING_SPLIT('#254#251451#', '#')
 WHERE  TRIM(value) <> '';

В зависимости от вашей версии SQL-Server это встроенная функция.Если вы используете более старую версию, посмотрите здесь функции разделения строк.Есть много вариантов.

0 голосов
/ 04 июля 2019

Вот решение.Надеюсь на помощь, мой друг:))

Я добавил еще один параметр @separator, вы можете удалить его, установив значение "#".

ALTER FUNCTION dbo.fnToken
(   
@stringToSplit VARCHAR(MAX), @separator nchar(1)
)
RETURNS @Listenum TABLE(num varchar(50))
AS
begin
DECLARE @name NVARCHAR(255)
 DECLARE @pos INT

 WHILE CHARINDEX(@separator, @stringToSplit) > 0
 BEGIN
  SELECT @pos  = CHARINDEX(@separator, @stringToSplit)  
  SELECT @name = SUBSTRING(@stringToSplit, 1, @pos-1)

  INSERT INTO @Listenum 
  SELECT @name

  SELECT @stringToSplit = SUBSTRING(@stringToSplit, @pos+1, LEN(@stringToSplit)-@pos)
 END

 INSERT INTO @Listenum
 SELECT @stringToSplit
Return

ENd 


SELECT num 
FROM dbo.fnToken('#254#251451#', '#')
WHERE TRIM(num) <>''
0 голосов
/ 04 июля 2019

Вы не можете ссылаться на Табличную функцию, как на скалярную функцию. Но это действительно плохой способ разделения значений из значения с разделителями, поскольку он итеративный. Используйте XML Splitter , DelimitedSplit8K_LEAD или STRING_SPLIT (если вы используете SQL Server 2016 +).

Если вы используете STRING_SPLIT, правильный синтаксис будет:

SELECT SS.[value] AS num
FROM STRING_SPLIT(''#254#251451#','#') SS
WHERE SS.[value] != '';

Тот же синтаксис будет верен для DelimitedSplit8K_LEAD, если вы не используете SQL Server 2016 +.

Редактировать: Op использует старую (и собирается быть полностью неподдерживаемую) версию SQL Server, поэтому им нужно будет использовать DelimitedSplit8k.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...