使用函数中的字符串时,parsename 不起作用

parsename is not working when using string from function

Parsename 在直接使用字符串或从函数返回静态值时有效。但是当我从函数返回带点的 select 值时。它不工作。我无法弄清楚这个问题。

     CREATE TABLE [dbo].[TestTimeLine](
                [UserID] [int] NOT NULL,
                [Field1] [nchar](250) NOT NULL,
                [Value] [smalldatetime] NULL,
                [Timestamp] [datetime] NULL,
            )

           INSERT INTO [TestTimeLine] VALUES(10,'TestDate',GETDATE(),GETDATE())
    CREATE FUNCTION TestFunction()
    RETURNS NVARCHAR(MAX)
    AS
    BEGIN
            DECLARE @R NVARCHAR(MAX)
            SELECT TOP 1 @R=CAST(DATENAME(month,value) AS VARCHAR) + ' ' + CAST(YEAR(value) AS VARCHAR) + '.' +CONVERT(varchar,value,101) + '. ' + LTRIM(Field1)
             FROM   [TestTimeLine]          
             WHERE  UserId = 10
             RETURN @R
    END


select dbo.TestFunction()
select PARSENAME(dbo.TestFunction(),2)

工作

select PARSENAME('January 2015.01/05/2015. TestDate',2)

不工作 -- Returns NULL

select PARSENAME(dbo.TestFunction(),2)

尝试将参数 2 更改为 1。

select PARSENAME(dbo.TestFunction(),1)

更多详情请参考: More Details

问题是 dbo.TestFunction() 的 return 值是不正确的标识符 - 它超过了 SQL 服务器中对象标识符的最大长度限制。您的示例 return 值有很多尾随空格,导致出现这种情况。

一般来说,将 PARSENAME 用于您的目的不是一个好主意,因为您使用该函数不是为了它的初始目的,所以您会产生所有副作用,而这些副作用是一个 SQL 服务器版本到另一个。在你的情况下使用普通的字符串函数。

我收到了问题。

问题是 [nchar] 数据类型。

更改为 'Varchar' 数据类型后。它工作正常。