SQL转换行号时转换失败

SQL Conversion failed when converting row number

所以我一直在尝试添加动态行号列而不使用动态 SQL。但是,当我尝试时出现错误 'Conversion failed when converting character string to smalldatetime data type.'

我知道错误来自函数所以如果你只想查看函数中的 switch case 就是问题所在,但这里是存储过程以备不时之需。

我有一个如下所示的存储过程:

ALTER PROCEDURE [dbo].[MMS_EdgateMainQueue] 
-- Add the parameters for the stored procedure here
@OrderByColumnID int = 3,
@Skip int = 0,
@Take int = 0,
@Descending bit = 1,
@ResultCount INT OUTPUT
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;




Declare @UrlTitlePrefix varchar(2080) = '<a href="/Title/PageByExtTitleID?ActionName=Edgate&ExtTitleID=' 
Declare @UrlProducerPrefix varchar(2080) = '<a href="/Producers/ByExtVendorID?ActionName=Details&ExtVendorID=' 
Declare @Urlmidfix varchar(100) = '">' 
Declare @UrlPostFix varchar(100) = '</a>' 



SELECT TOP (@Take)
        [row_numb],
        @UrlTitlePrefix  + ExtTitleID + @Urlmidfix + ExtTitleID + @UrlPostFix as [Item #], 
        f.Title as Name,
        @UrlProducerPrefix + f.ExtVendorID + @Urlmidfix + f.DisplayName + @UrlPostFix as Producer,
        f.Created as Created,
        isnull(f.Academic, '') as Academic,
        isnull(f.Sears,'') as Sears,
        isnull(f.Editor, '') as Editor,
        CONVERT(INT, f.[Copy]) AS Copy,
        f.[Segment],
        CONVERT(INT, f.[Taxonomy]) AS Taxonomy,
        f.[Priority]
    FROM EdgateNewTitlesInnerQuery(@OrderByColumnID, @Descending) as f
Where f.[row_numb] Between  ((@Skip * @Take) + 1)  and ((@Skip + 1) * @Take) order by  f.[row_numb]


END

内部函数如下所示:

ALTER FUNCTION [dbo].[EdgateNewTitlesInnerQuery]
(   
  @OrderByColumnID int,
  @Descending bit 

)
RETURNS TABLE 
AS
RETURN 
(


SELECT DISTINCT 
                v.ExtVendorID, 
                t.ID, 
                t.ExtTitleID, 
                t.Title, 
                v.DisplayName, 
                t.Created, 
                ecs.Title as [Academic],
                ssub.Title as [Sears],
                etw.EditorName as [Editor],
                etw.CopyDone AS [Copy], 
                etw.SegmentsStatus as [Segment],
                etw.TaxonomyDone AS [Taxonomy],
                CASE WHEN wft.[Priority] is null THEN 0 ELSE wft.[Priority] END as [Priority],
                --row_number() OVER (ORDER BY t.Created DESC) AS [row_number]

 row_number() OVER (ORDER BY 

            CASE @OrderByColumnID WHEN 0 THEN t.ExtTitleID
                WHEN 1 THEN t.Title
                WHEN 2 THEN v.DisplayName
                WHEN 3 THEN t.Created
                WHEN 4 THEN ecs.Title
                WHEN 5 THEN ssub.Title
                WHEN 6 THEN etw.EditorName
                WHEN 7 THEN etw.CopyDone
                WHEN 8 THEN etw.SegmentsStatus
                WHEN 9 THEN etw.TaxonomyDone
                WHEN 10 THEN CASE WHEN wft.[Priority] is null THEN 0 ELSE wft.[Priority] END 
                ELSE t.Created
END DESC ) AS [row_numb]

FROM  [Title] t 
join EdgateTitleWorkflow etw on etw.FK_TitleID = t.ID
join Vendor v on v.ExtVendorID = t.ProducerID
join CollectionItem i on i.TitleID = t.ID and i.CollectionID = 16
left join [EdgateSuggestedAcademicSubject] esas on esas.FK_TitleID = t.ID and esas.isPrimary = 1
left join EC_Subject ecs on ecs.ID = esas.FK_SubjectID
left join [FMGSuggestedSears] fss on fss.FK_TitleID = t.ID and fss.isPrimary = 1
left join [FMGSearsSubjects] ssub on ssub.ID = fss.SearsSubjectID and ssub.ParentID is null
left join [WorkFlow_Tracker] wft on wft.TitleID = t.ID
where (etw.CopyDone = 0 or etw.TaxonomyDone = 0 or etw.SegmentsStatus = 0)

)

我最初尝试将其作为字符串传递,但它根本无法排序。所以我在寻找类似的问题并尝试了这个解决方案 Here 但是我的 switch Case 现在抛出一个转换错误。有人知道如何解决这个问题吗?

问题是 case 是 returns 一种类型的表达式,在编译期间定义。您可以使用每个键的单独案例来解决此问题。我想这就是你想要的声明:

row_number() OVER (ORDER BY (CASE WHEN @OrderByColumnID = 0 THEN t.ExtTitleID END),
                            (CASE WHEN @OrderByColumnID = 1 THEN t.Title END),
                            (CASE WHEN @OrderByColumnID = 2 THEN v.DisplayName END),
                            (CASE WHEN @OrderByColumnID = 3 THEN t.Created END),
                            (CASE WHEN @OrderByColumnID = 4 THEN ecs.Title END),
                            (CASE WHEN @OrderByColumnID = 5 THEN ssub.Title END),
                            (CASE WHEN @OrderByColumnID = 6 THEN etw.EditorName END),
                            (CASE WHEN @OrderByColumnID = 7 THEN etw.CopyDone END),
                            (CASE WHEN @OrderByColumnID = 8 THEN etw.SegmentsStatus END),
                            (CASE WHEN @OrderByColumnID = 9 THEN etw.TaxonomyDone END),
                            (CASE WHEN @OrderByColumnID = 10 THEN COALESCE(wft.[Priority], 0) END) 
                            t.Created DESC
                  )