Sql 我希望我的函数返回一个表,其中包含

Sql 我希望我的函数返回一个表,其中包含,sql,sql-server,Sql,Sql Server,我得到以下错误: Msg 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 varch

我得到以下错误:

Msg 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


不能像标量函数那样引用表值函数。但这是一种非常糟糕的方法,因为它是迭代的,所以要将值从分隔值中分离出来。如果您使用的是SQL Server 2016+,请使用或字符串分割

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

SELECT SS.[value] AS num
FROM STRING_SPLIT(''#254#251451#','#') SS
WHERE SS.[value] != '';
如果您不在SQL Server 2016+上,则DelimitedSplit8K_LEAD的语法相同

编辑:Op使用的是一个旧的、即将完全不受支持的SQL Server版本,因此他们需要使用。

您可以尝试:

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

根据您的SQL Server版本,它是一个内置函数。如果您使用的是旧版本,请查看此处的字符串拆分函数。有很多选择。

这里有一个解决方案。希望能帮上忙,我的朋友:

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

你就不能把它们换掉吗?对于错误,只需修复select dbo.fnToken'254251451'您没有指定从dbo.fnToken中选择什么。我想用表函数返回该令牌中的数字@YounesHarir的版本是什么?我是Sql server 2008R2用户,所以我想这些函数对我不起作用,2008R2还有5天的支持期,@YounesHarir,你真的应该看看更新。