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
)
所以我一直在尝试添加动态行号列而不使用动态 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
)