当直接使用字符串或从函数返回静态值时,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)
答案 0 :(得分:0)
答案 1 :(得分:0)
问题是dbo.TestFunction()
的返回值是不正确的标识符 - 它超出了SQL Server中对象标识符的最大长度限制。您的样本返回值有许多尾随空格,导致这种情况。
一般情况下,将PARSENAME
用于您的目的并不是一个好主意,因为您使用的函数不是出于其初始目的,因此您可能会遇到从一个SQL Server版本到另一个SQL Server版本无法预测的所有副作用。在你的情况下使用普通的字符串函数。
答案 2 :(得分:0)
我得到了问题。
问题是[nchar]
数据类型。
更改为' Varchar'数据类型。工作正常。