【问题标题】:Altering stored procedure displays `Argument data type ntext is invalid for argument 1 of left function` error更改存储过程显示“Argument data type ntext is invalid for argument 1 of left function”错误
【发布时间】:2023-10-15 17:55:02
【问题描述】:

我有这个存储过程:

ALTER PROCEDURE [dbo].[OptimizedGetArticlePostAMP] 
     (@PostID int)     
--[ OptimizedGetArticlePostAMP] 678161      
-- 732490        
AS
BEGIN
    DECLARE @SectionId int, @datediff int                                    
    DECLARE @postdate datetime

    SELECT 
        P.PostId, P.SectionID, P.PostName, 
        MP.MetaTitle, P.Postdate, P.PostAuthor, P.IsApproved,
        MP.Metadescription, MP.Metakeywords, 
        P.TotalViews, P.Subject, P.FormattedBody,                      
        MV.Isvideo, MV.VideoCode, MV.VideoCaption, 
        A.DrComment, A.SpanishURL, PS.RedirectUrl,
        MP.Canonical as Canonical, PS.StatusId,
        dbo.[ GetCommentCountForPost](@PostId) as TotalReplies,  
        PRD.StoryImage, PRD.StoryContent,                             
        MH.LastModifiedDate,
        REPLACE(LEFT(P.FormattedBody, CHARINDEX('</strong>', P.FormattedBody) - 1),'<p><strong>By','') <--This Line shows **error**
    FROM 
        csposts P 
    LEFT JOIN
        NewsletterDetails A ON (P.Postid = A.postid)       
    LEFT JOIN
        PostStatus PS ON (PS.postid = p.postid)
    LEFT JOIN  
        PostMetatags MP ON (P.postid = MP.Postid)              
    LEFT JOIN
        postVideo MV ON (P.postid = MV.Postid)
    LEFT JOIN 
        CSPostAttachments PA ON P.PostId = PA.PostId 
                             AND PA.contenttype LIKE 'audio/mpeg' 
                             AND PA.FILENAME LIKE '%.mp3' 
                             AND PA.isremote = 1
    LEFT JOIN  
        PostRelatedData PRD ON P.PostId = PRD.PostId
    LEFT JOIN  
        PostReferences PR on P.PostId = PR.PostId
    CROSS APPLY 
        (SELECT TOP 1 LastModifiedDate 
         FROM ArticleModifiedHistory 
         WHERE ArticleModifiedHistory.Postid = P.postid 
         ORDER BY LastModifiedDate desc) MH
    WHERE
        P.Postid = @Postid     
END

由于我使用了 LEFT 函数,它显示以下错误:

参数数据类型 ntext 对左函数的参数 1 无效。

请让我知道我需要进行哪些更改才能使其运行。

【问题讨论】:

  • 为什么不是varchar(max)
  • 你试过把P.FormattedBody改成CAST(P.FormattedBody as nvarchar(max))吗?
  • ntexttextimage 数据类型将在 SQL Server 的未来版本中删除。避免在新的开发工作中使用这些数据类型,并计划修改当前使用它们的应用程序。请改用nvarchar(max)varchar(max)varbinary(max)See details here
  • 谢谢大家...!!

标签: sql sql-server sql-server-2008 stored-procedures


【解决方案1】:

你可以替换

LEFT([Column], 123)

通过

SUBSTRING([Column], 1, 123)

SUBSTRING 很乐意接受 ntext 数据类型。

参考:SUBSTRINGLEFT

【讨论】:

    【解决方案2】:

    Left 函数不接受 ntext 数据类型。就像 gofr1 所说的首先将其转换为 nvarchar 或使用接受 ntext 参数的子字符串函数。

    【讨论】:

    • 我建议你删除这个答案,它更适合作为评论。 :) 或者改写你的答案。只是建议!