我遇到以下错误:
第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
答案 0 :(得分:1)
您可以尝试:
SELECT value
FROM STRING_SPLIT('#254#251451#', '#')
WHERE TRIM(value) <> '';
取决于您的SQL Server版本,它具有内置功能。如果您使用的是旧版本,请在此处查看字符串拆分功能。有很多选择。
答案 1 :(得分:0)
您不能像“标量函数”一样引用表值函数。但这是将值从定界值中分离出来的一种非常糟糕的方法,因为它是迭代的。使用XML Splitter,DelimitedSplit8K_LEAD
或SELECT 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) <>''