2012-03-13 89 views
0
 DECLARE @ActionNumber varchar(20)='EHPL-DES-SQ-1021' 
     set @ActionNumber=(select top 1 * from dbo.ANOSplit(@ActionNumber,'-') 
     order by ROW_NUMBER() OVER (ORDER BY items)) 
     select @ActionNumber 

从上述查询获取第N行的值我需要Split()后从初始@ActionNumberEHPL-DES-SQ-1021”返回2ND3RD索引。所述ActionNumber的在SQL Server

格式是完全如上但DESSQ和可以改变。

所以我不能使用ORDER BY项目ASC或ORDER BY项目DESC,因为它将按字母顺序排序。

上面的查询返回'EHPL'.how我可以得到DES和SQ。

+0

查询中的“items”是什么? – Vikram 2012-03-13 06:21:11

+0

item是通过分割函数返回的值ANOSplit在这种情况下它是1021 – chamara 2012-03-13 06:30:32

回答

3

您可以用ANOSplit功能做到这一点,但我会将结果插入临时表或表变量中。
正如你所说,你不能只是ORDER BYANOSplit函数返回的值,因为它将按字母顺序排序。
- >所以,你可以使用一个临时表与IDENTITY列,然后用此排序:

DECLARE @ActionNumber varchar(20)='EHPL-DES-SQ-1021' 

declare @tmp table 
(
    id int identity(1,1), 
    item varchar(20) 
) 

insert into @tmp (item) 
select * from dbo.ANOSplit(@ActionNumber,'-') 

select * from @tmp where id in (2,3) 

该项目将被插入到表中由该函数返回的确切顺序,那么在插入后你知道id 2和3是你想要的。

0

尝试使用SubstringCharIndex >>>

DECLARE @ActionNumber varchar(20)='EHPL-DES-SQ-1021' 
select SUBSTRING (@ActionNumber,CHARINDEX ('-',@ActionNumber,0) + 1, 3) 
+1

欢迎使用StackOverflow:如果您发布代码,XML或数据样本,请**在文本编辑器中突出显示这些行,然后单击“代码示例”按钮('{}')在编辑器工具栏上进行恰当的格式化和语法突出显示! – 2012-03-13 06:40:40

-1

这不是测试,但我认为它会工作:

DECLARE @ActionNumber varchar(20)='EHPL-DES-SQ-1021' 
WITH nCTE AS 
(
    SELECT 
     ROW_NUMBER() OVER (ORDER BY items) AS RNum 

    FROM dbo.ANOSplit(@ActionNumber,'-') 
) 
SELECT * FROM nCTE WHERE RNum = 2 --put n here 
+1

OP不能使用'ORDER BY'。 – 2012-03-13 07:03:29