2015-06-11 34 views
1

我有TSQL中的表值函数,如果我传递一个字符串,但如果我传递一个varchar,则不会有效。TSQL表值函数参数不同的行为,如果参数变量

例如,这个工程:

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 

我有与多个表值函数相同的结果,所以我想我的问题是我从错误的变量中调用它的方式。我怎样才能使用一个变量,仍然有相同的输出?

回答

2

默认长度为VARCHAR时,声明不带长度是1或有时30。在你的情况下,它默认为1。这就是为什么你只看到1行t。您应该声明@invarcharVARCHAR(MAX),或者只需添加一个长度。

DECLARE @invarchar as `VARCHAR(MAX)` 

有关更多信息,请参见本article亚伦伯特兰。