我希望函数返回一个表,其中包含#号内的数字

时间:2019-07-04 08:22:32

标签: sql sql-server

我遇到以下错误:

  

第208行,状态6,状态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 个答案:

答案 0 :(得分:1)

您可以尝试:

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

取决于您的SQL Server版本,它具有内置功能。如果您使用的是旧版本,请在此处查看字符串拆分功能。有很多选择。

答案 1 :(得分:0)

您不能像“标量函数”一样引用表值函数。但这是将值从定界值中分离出来的一种非常糟糕的方法,因为它是迭代的。使用XML SplitterDelimitedSplit8K_LEADSELECT SS.[value] AS num FROM STRING_SPLIT(''#254#251451#','#') SS WHERE SS.[value] != ''; (如果您使用的是SQL Server 2016 +)。

如果您使用的是STRING_SPLIT,则正确的语法为:

DelimitedSplit8K_LEAD

如果您不使用SQL Server 2016+,则.api_secret的语法相同。

编辑:Op使用的是旧版(即将完全不受支持)SQL Server,因此他们将需要使用DelimitedSplit8k

答案 2 :(得分:0)

这是一个解决方案。希望对您有帮助,我的朋友:))

我添加了更多@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) <>''