2012-03-13 35 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