Sql 行数超过文本列排序
我在SQL Server中使用行号进行动态排序时遇到问题。我让它工作,但它在非数字字段上抛出错误。我需要做什么改变才能让Alpha正常工作Sql 行数超过文本列排序,sql,sql-server,row-number,Sql,Sql Server,Row Number,我在SQL Server中使用行号进行动态排序时遇到问题。我让它工作,但它在非数字字段上抛出错误。我需要做什么改变才能让Alpha正常工作 ID Description 5 Test 6 Desert 3 A evil 我有一个Sql产品 CREATE PROCEDURE [CRUDS].[MyTable_Search] -- Add the parameters for the stored procedure here -- Full Para
ID Description
5 Test
6 Desert
3 A evil
我有一个Sql产品
CREATE PROCEDURE [CRUDS].[MyTable_Search]
-- Add the parameters for the stored procedure here
-- Full Parameter List
@ID int = NULL,
@Description nvarchar(256) = NULL,
@StartIndex int = 0,
@Count int = null,
@Order varchar(128) = 'ID asc'
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for procedure here
Select * from
(
Select ROW_NUMBER() OVER
(Order By
case
when @Order = 'ID asc' then [TableName].ID
when @Order = 'Description asc' then [TableName].Description
end asc,
case
when @Order = 'ID desc' then [TableName].ID
when @Order = 'Description desc' then [TableName].Description
end desc
) as row,
[TableName].* from [TableName]
where
(@ID IS NULL OR [TableName].ID = @ID) AND
(@Description IS NULL OR [TableName].Description = @Description)
) as a
where
row > @StartIndex
and (@Count is null or row <= @StartIndex + @Count)
order by
case
when @Order = 'ID asc' then a.ID
when @Order = 'Description asc' then a.Description
end asc,
case
when @Order = 'ID desc' then a.ID
when @Order = 'Description desc' then a.Description
end desc
END
这对我来说很好:
declare @TableName table (id int,Description varchar(50))
insert @TableName values (1,'aaa')
insert @TableName values (2,'bbb')
insert @TableName values (3,'ccc')
insert @TableName values (4,'ddd')
insert @TableName values (5,'eee')
insert @TableName values (6,'fff')
insert @TableName values (7,'ggg')
insert @TableName values (8,'hhh')
DECLARE @Order varchar(10)
,@ID int
,@Description varchar(50)
,@StartIndex int
,@Count int
SELECT @Order='Description desc'
,@StartIndex=2
,@Count=3
--query unchanged, except alias to "t" and table name to "@TableName"
Select * from
(
Select ROW_NUMBER() OVER
(Order By
case
when @Order = 'ID asc' then t.ID
when @Order = 'Description asc' then t.Description
end asc,
case
when @Order = 'ID desc' then t.ID
when @Order = 'Description desc' then t.Description
end desc
) as row,
t.* from @TableName t
where
(@ID IS NULL OR t.ID = @ID) AND
(@Description IS NULL OR t.Description = @Description)
) as a
where
row > @StartIndex
and (@Count is null or row <= @StartIndex + @Count)
order by
case
when @Order = 'ID asc' then a.ID
when @Order = 'Description asc' then a.Description
end asc,
case
when @Order = 'ID desc' then a.ID
when @Order = 'Description desc' then a.Description
end desc
可能会发布更多有关运行此操作的数据的详细信息以及实际的错误消息
根据OP的评论进行编辑,请尝试以下操作:
declare @TableName table (id int,Description varchar(50))
insert @TableName values (1,'1')
insert @TableName values (2,'bbb')
insert @TableName values (3,'ccc')
insert @TableName values (4,'ddd')
insert @TableName values (5,'eee')
insert @TableName values (6,'fff')
insert @TableName values (7,'ggg')
insert @TableName values (8,'hhh')
DECLARE @Order varchar(50)
,@ID int
,@Description varchar(50)
,@StartIndex int
,@Count int
SELECT @Order='Description desc'
,@StartIndex=2
,@Count=3
Select * from
(
Select ROW_NUMBER() OVER
(Order By
case
when @Order = 'ID asc' then RIGHT(REPLICATE('0',10)+CONVERT(varchar(10),t.ID),10)
when @Order = 'Description asc' then t.Description
end asc,
case
when @Order = 'ID desc' then RIGHT(REPLICATE('0',10)+CONVERT(varchar(10),t.ID),10)
when @Order = 'Description desc' then t.Description
end desc
) as row,
t.* from @TableName t
where
(@ID IS NULL OR t.ID = @ID) AND
(@Description IS NULL OR t.Description = @Description)
) as a
where
row > @StartIndex
and (@Count is null or row <= @StartIndex + @Count)
order by
case
when @Order = 'ID asc' then RIGHT(REPLICATE('0',10)+CONVERT(varchar(10),a.ID),10)
when @Order = 'Description asc' then a.Description
end asc,
case
when @Order = 'ID desc' then RIGHT(REPLICATE('0',10)+CONVERT(varchar(10),a.ID),10)
when @Order = 'Description desc' then a.Description
end desc
旁注:将@Count is null条件添加到谓词将大大降低查询速度。您应该将该行更改为或行您是否解决了此问题?我认为如果您的选择已经有一个,您不需要额外的顺序。仍在寻找比将所有内容转换为字符并在左侧填充零更优雅的内容。将@ORDER更改为varchar50而不是10,10是截断排序顺序,因此排序部分被跳过。因此,基本上,我必须将所有列转换为单个数据类型varchar进行排序?我在表中还有其他列,只是想确定一下。我总是将其转换为字符串,但我通常在排序时合并列,以区分主列何时可能有重复的列。例如,如果按日期排序,则不希望包含其他列,因为可能存在具有相同日期的行。当您转换为字符串时,请考虑它们的排序方式:数字需要前导零,否则您将得到1,10,11,2,22。。。使用样式121 YYYY-MM-DD hh:mi:ss.mmm格式化日期时间,在列之间放置管道|或其他内容,填充空值等。
declare @TableName table (id int,Description varchar(50))
insert @TableName values (1,'1')
insert @TableName values (2,'bbb')
insert @TableName values (3,'ccc')
insert @TableName values (4,'ddd')
insert @TableName values (5,'eee')
insert @TableName values (6,'fff')
insert @TableName values (7,'ggg')
insert @TableName values (8,'hhh')
DECLARE @Order varchar(50)
,@ID int
,@Description varchar(50)
,@StartIndex int
,@Count int
SELECT @Order='Description desc'
,@StartIndex=2
,@Count=3
Select * from
(
Select ROW_NUMBER() OVER
(Order By
case
when @Order = 'ID asc' then RIGHT(REPLICATE('0',10)+CONVERT(varchar(10),t.ID),10)
when @Order = 'Description asc' then t.Description
end asc,
case
when @Order = 'ID desc' then RIGHT(REPLICATE('0',10)+CONVERT(varchar(10),t.ID),10)
when @Order = 'Description desc' then t.Description
end desc
) as row,
t.* from @TableName t
where
(@ID IS NULL OR t.ID = @ID) AND
(@Description IS NULL OR t.Description = @Description)
) as a
where
row > @StartIndex
and (@Count is null or row <= @StartIndex + @Count)
order by
case
when @Order = 'ID asc' then RIGHT(REPLICATE('0',10)+CONVERT(varchar(10),a.ID),10)
when @Order = 'Description asc' then a.Description
end asc,
case
when @Order = 'ID desc' then RIGHT(REPLICATE('0',10)+CONVERT(varchar(10),a.ID),10)
when @Order = 'Description desc' then a.Description
end desc
RIGHT(REPLICATE('0',10)+CONVERT(varchar(10),ID),10)