我在TSQL中有一个表值函数,如果我传递一个字符串,但是如果我传递一个varchar则不行。
例如,这有效:
SELECT * from [dbo].[SplitString]('ta;aa;qq', ';')
这不起作用:
declare @invarchar as varchar
set @invarchar = 'ta;aa;qq'
SELECT * from [dbo].[SplitString](@invarchar, ';')
如果您对该功能感到好奇:
CREATE FUNCTION [dbo].[SplitString]
(
@List NVARCHAR(MAX),
@Delim VARCHAR(255)
)
RETURNS TABLE
AS
RETURN ( SELECT [Value] FROM
(
SELECT
[Value] = LTRIM(RTRIM(SUBSTRING(@List, [Number],
CHARINDEX(@Delim, @List + @Delim, [Number]) - [Number])))
FROM (SELECT Number = ROW_NUMBER() OVER (ORDER BY name)
FROM sys.all_objects) AS x
WHERE Number <= LEN(@List)
AND SUBSTRING(@Delim + @List, [Number], LEN(@Delim)) = @Delim
) AS y
);
GO
我有多个表值函数的结果相同,所以我猜我的问题是我从错误的变量调用它的方式。如何使用变量并仍具有相同的输出?
答案 0 :(得分:2)
宣布没有长度的VARCHAR
默认长度为1
或有时为30
。在您的方案中,默认为1
。这就是为什么你只能看到t
行的结果。您应该将@invarchar
声明为VARCHAR(MAX)
,或者只是添加一个长度。
DECLARE @invarchar as `VARCHAR(MAX)`
有关详细信息,请参阅Aaron Bertrand的article。