TSQL表值函数如果参数是变量,则参数不同

时间:2015-06-11 01:07:39

标签: sql-server tsql sql-server-2012

我在TSQL中有一个表值函数,如果我传递一个字符串,但是如果我传递一个varchar则不行。

例如,这有效:

SELECT * from [dbo].[SplitString]('ta;aa;qq', ';')

enter image description here

这不起作用:

declare @invarchar as varchar
set @invarchar = 'ta;aa;qq'
SELECT * from [dbo].[SplitString](@invarchar, ';')

enter image description here

如果您对该功能感到好奇:

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

我有多个表值函数的结果相同,所以我猜我的问题是我从错误的变量调用它的方式。如何使用变量并仍具有相同的输出?

1 个答案:

答案 0 :(得分:2)

宣布没有长度的VARCHAR默认长度为1或有时为30。在您的方案中,默认为1。这就是为什么你只能看到t行的结果。您应该将@invarchar声明为VARCHAR(MAX),或者只是添加一个长度。

DECLARE @invarchar as `VARCHAR(MAX)`

有关详细信息,请参阅Aaron Bertrand的article