SQL-Funktion zu ersetzen, mehrere Zeichen in string
Ich Schreibe einen SQL Server 2008 Benutzer-definierte Funktion ersetzen Sie eine Zeichenfolge von Zeichen mit anderen Zeichen. Ich denke der folgende code sollte funktionieren, aber es funktioniert nicht. Es scheint sich nicht um die Aktualisierung der variable für @input
richtig.
Irgendeine Idee, wie kann ich dieses Problem beheben?
DECLARE @Input AS VarChar(1000)
DECLARE @i AS TinyInt
DECLARE @Substring AS VarChar(1000)
DECLARE @Prestring AS VarChar(1000)
DECLARE @Poststring AS VarChar(1000)
Select @Input='ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789',
@i = 1
WHILE @i <= LEN(@Input)
BEGIN
SELECT @Prestring = SUBSTRING(@Input,-1,@i)
SELECT @Poststring = SUBSTRING(@Input,@i+1,LEN(@Input))
SELECT @Substring = replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace
(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace(replace
(SUBSTRING(@Input,@i,1), 'A', 'N'),'B', 'O'), 'C', 'P'), 'D', 'Q'), 'E', 'R'), 'F', 'S'), 'G', 'T'), 'H', 'U'), 'I', 'V'), 'J', 'W'), 'K', 'X'), 'L', 'Y'), 'M', 'Z'), 'N', 'A'), '0', 'B'), 'P', 'C')
, 'Q', 'D'),'R', 'E'),'S', 'E'),'T', 'E'),'U', 'F'),'V', 'G'),'W', 'H'),'X', 'I'),'Y', 'J'), '1', '9'),'2','8'),'3','7'),'4','6'),'5','5'),'6','4'),'7','3'),'8','2'),'9','1'),' ','')
SELECT @Input = @Prestring + @Substring + @Poststring
SELECT @i = @i + 1
PRINT 'Prestring= ' + @Prestring PRINT 'SUBSTRING= ' + @Substring PRINT 'PostString= ' + @Poststring PRINT 'Total String: ' + @Prestring + ' + ' + @Substring + ' + ' + @Poststringenter code here
PRINT 'END'
END
Output:
Prestring=
SUBSTRING= A
PostString= BCDEFGHIJKLMNOPQRSTUVWXYZ123456789
Total String: + A + BCDEFGHIJKLMNOPQRSTUVWXYZ123456789
1
END
Prestring= A
SUBSTRING= O
PostString= CDEFGHIJKLMNOPQRSTUVWXYZ123456789
Total String: A + O + CDEFGHIJKLMNOPQRSTUVWXYZ123456789
2
END
Prestring= AO
SUBSTRING= C
PostString= DEFGHIJKLMNOPQRSTUVWXYZ123456789
Total String: AO + C + DEFGHIJKLMNOPQRSTUVWXYZ123456789
3
END
Prestring= AOC
SUBSTRING= D
PostString= EFGHIJKLMNOPQRSTUVWXYZ123456789
Total String: AOC + D + EFGHIJKLMNOPQRSTUVWXYZ123456789
4
END
......
- Jede andere detail? DBMS? Symptome?
- Was den Wert von @input erwarten Sie am Ende der Fahrt? Und was ist es, was Ihnen jetzt?
- Entschuldigung, MS SQL 2008. Ich kann nach der Ausgabe ich immer bin, aber bestätigt ist es dasselbe auf einem anderen system mit SQL2008
- Wie kam es zu solch einem hässlichen suchen, wählen Sie @Substring Anweisung. Mein Tipp: erstellen Sie eine Funktion, die eine leere Zeichenfolge zurück und übergeben Sie dann in Ein und fixieren Sie den code in der Funktion den richtigen Wert zurück. Tun Sie dies für jeden einzelnen Charakter. Einmal können Sie ein Zeichen in einer Zeit, können Sie sich sorgen über die Verarbeitung mehrerer Zeichen.
- Ich erwarte, dass NMNOPQRSTUVWXYZ987654321
- War das nicht früher diskutiert?
- ja, aber ich war nicht sicher, ob ich sollte einen neuen thread aufmachen, wie Ihr effektiv ein diff Problem als ich neu geschrieben haben, den code zu sehen, letzten Funktion war fehlerhaft.
- würde das nicht bedeuten, mit der gleichen ersetzen code in der Funktion?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist ein weiterer Weg, das wird funktionieren bidirektional:
Ich würde wahrscheinlich verwenden eine table-variable wie eine Karte, wenn Sie mehr Bedingungen. Sie können hinzufügen, Umgang mit Kleinbuchstaben, Nullen, Nullen, etc. Außerdem würde ich Vorsicht vor der Verwendung als eine Art von Chiffre für alles andere als Spaß.
Überprüfen Sie Ihre conversions.
Konvertieren Sie C->P und dann später ersetzen updates, die es als P->C.
Jeder ersetzen wird sequentiell aus den inneren Anruf. Sollten Sie brechen, diese in eine Funktion, und zurückkehren, sobald es passt etwas das erste mal.
Dieser sollte Ihnen den Einstieg...
Habe ich noch nicht getestet, aber es würde Folgen aus dem obigen code. Es sollte zumindest geben Ihnen eine Idee auf, wie Sie dies tun könnte.
Siehe unten für meine Antworten! Vielen Dank an alle, das war schwieriger, als es sein sollte für mich!
create function dbo.Translate(@Input varchar(1000))
RETURNS VARCHAR (1000)
BEGINNEN