2016-01-26 5 views
0

Я пытаюсь сортировать строку, такую ​​как «3,9,6» до «3,6,9» с TSQL. Мой подход заключался в извлечении символов из строки, их литье в виде целых чисел и помещение их в #temptable с использованием первичного ключа для сортировки. Для этого я создал эту процедуру:Сортировка целых чисел в строке с TSQL

create proc sortstring(@string varchar(50)) 
as 
    declare @limit int = len(@string) 
    declare @counter int = 1 
    declare @temps char 
    create table #temptable (tempstring varchar(30) primary key) 
     while @counter<[email protected] 
      begin 
       set @temps = SUBSTRING(@string,@counter,1) 
        if(@temps!=',') 
         insert into #temptable values (CAST(@temps as int)) 
       set @counter= @counter+1 
      end 

После этого процесса, я думал, чтобы извлечь целые числа от #temptable с петлей в то время, чтобы создать отсортированный формат строки «3,6'9». Но я думаю, что мой подход неэффективен.

Любые предложения?

ответ

0

Ниже метод должен быть немного лучше, чем в то время как петли

declare @string varchar(255) = '3,9,6,0,5,12,88,15,23,45,77,88,125,1' 
declare @TableList table (tmpStr int) 

DECLARE @XML XML 

SET @XML = '<root><csv>' + replace(@string, ',', '</csv><csv>') + '</csv></root>' 

INSERT @TableList 
SELECT replace(Word.value('.', 'integer'), CHAR(10), '') 
FROM @XML.nodes('/root/csv') AS WordList(Word) 

select * from @TableList order by 1 
go 
+0

Спасибо, я понятия не имею, что мы могли бы достичь этого, используя xml – ymuribbi

0
IF OBJECT_ID('tempdb.dbo.#TableList') IS NOT NULL 
    DROP TABLE #TableList 

create table #TableList (tmpStr int) 
declare @string varchar(255) = '3,9,6,0,5,12,88,15,23,45,77,88,125,1' 

SET @string = 'SELECT ' + REPLACE(@string,',',' UNION ALL SELECT ') 

SET @string='INSERT INTO #TableList (tmpStr) ' + @string 

EXEC(@string) 

SELECT * FROM #TableList ORDER BY tmpStr 

его не традиционный подход, но он работает быстро.

+0

Спасибо, как вы сказали, это не обычный подход, но он очень изящный. – ymuribbi

Смежные вопросы