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

时间:2015-01-06 07:37:00

标签: sql sql-server tsql

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

     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)

NotWorking - 返回NULL

select PARSENAME(dbo.TestFunction(),2)

3 个答案:

答案 0 :(得分:0)

尝试将参数2更改为1.

select PARSENAME(dbo.TestFunction(),1)

有关详细信息,请参阅: More Details

答案 1 :(得分:0)

问题是dbo.TestFunction()的返回值是不正确的标识符 - 它超出了SQL Server中对象标识符的最大长度限制。您的样本返回值有许多尾随空格,导致这种情况。

一般情况下,将PARSENAME用于您的目的并不是一个好主意,因为您使用的函数不是出于其初始目的,因此您可能会遇到从一个SQL Server版本到另一个SQL Server版本无法预测的所有副作用。在你的情况下使用普通的字符串函数。

答案 2 :(得分:0)

我得到了问题。

问题是[nchar]数据类型。

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