Her seferinde 1 karakter sıyırma değerlerinde döngü


10

Değerler arasında döngü ve değerlerden bir anda 1 karakter şerit ve sonucu görüntülemek istiyorum.

Yani değerleri olan bir tablo varsa:

ID
___
34679
13390
89906

Sonucun böyle görünmesini istiyorum

Id
----
4679
679
79
9
3390
390
90
0
9906
906
06
6

Yanıtlar:


19

Lütfen bu tür şeyler için döngüler kullanmayın (hiyerarşiler gibi şeyler üzerinde çok daha az kontrole sahip olduğunuz senaryolar için özyinelemeli CTE'ler de ayırırım). SQL'de döngüler kötü; SQL, kümeler halinde çalışacak şekilde optimize edilmiştir.

DECLARE @foo TABLE(ID INT);

INSERT @foo VALUES(34679),(13390),(89906);

;WITH x AS 
(
  SELECT TOP (2048) n = ROW_NUMBER() OVER (ORDER BY Number)
  FROM master.dbo.spt_values ORDER BY Number
)
SELECT RIGHT(f.ID, x.n) FROM x
INNER JOIN @foo AS f
ON x.n < LEN(f.ID);

Sonuçlar:

9
79
679
4679
0
90
390
3390
6
06
906
9906

Yardımınız için teşekkürler. tam da bunu başarmaya çalışıyordum.
Kashif Qureshi

-1
declare @MyString varchar(500)

set MyString = '1,2.3#45.#,.6'

select dbo.RemoveChars(MyString, '#,.')

create function [dbo].[RemoveChars] (
    @InputString varchar(MAX)
    ,@CharsToRemove varchar(500)
    )
returns varchar(MAX)
as
begin
    declare @len int
        ,@Counter int
        ,@OneChar char(1)

    set @Counter = 1
    set @len = LEN(@CharsToRemove);

    while (1 = 1)
    begin
        set @OneChar = SUBSTRING(@CharsToRemove, @Counter, 1)
        set @InputString = REPLACE(@InputString, @OneChar, '')
        set @Counter = @Counter + 1

        if (
                @Counter > @len
                or @Counter > 20
                )
            break;
    end

    return @InputString
end

2
Kodunuzun nasıl çalıştığına dair biraz açıklama yapabilir misiniz? Bu, gelecekteki ziyaretçilere yardımcı olacaktır.
Kin Shah

-3
CREATE PROC udploop (@num varchar(10))
AS
       BEGIN 
             DECLARE @len int; 
             SET @len = LEN(@num); 
             WHILE (@len > 1)
                   BEGIN    
                         SELECT
                            @num = RIGHT(@num, @len - 1); 
                         PRINT @num;
                         SET @len = LEN(@num);
                   END 
       END

EXEC:

EXEC udploop 34679 
EXEC udploop 13390 
EXEC udploop 89906

SONUÇ:

4679 
679 
79 
9 
3390 
390 
90 
0 
9906 
906 
06 
6

1
Peki, masada çok sayıda satır olduğunda bunu nasıl öneriyorsunuz? Her satır için prosedürü - döngü içinde - çağırınız? Şimdi tüm bu değerleri çekmek için bir sorgu gerekir ve sonra her biri için saklı yordamı çağırmak için kodu oluşturur. Tablodaki her satır için, her değerdeki her karakter için bir döngü çalıştıran bir yordamı çağıran bir döngü var. Bu kesinlikle bu sorunu çözmenin etkili bir yolu değildir.
Aaron Bertrand

Teşekkürler. Ama Aaron'a katılıyorum. İstediğim bu değil. masamın 300 binden fazla değeri var. yani bu işe yaramayacak.
Kashif Qureshi
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.