SQL Server: beliebig Äquivalent strpos ()?
-
11-09-2019 - |
Frage
ich mit einem ärgerlichen Datenbank zu tun habe, wo ein Feld enthält, was wirklich zwei getrennte Felder gespeichert werden soll. So wird die Säule so etwas wie „der erste String ~ @ ~ Die zweite Zeichenfolge“ gespeichert, wobei „~ @ ~“ ist das Trennzeichen. (Noch einmal, ich habe das nicht entwerfen, ich versuche nur, es zu beheben.)
Ich möchte eine Abfrage diese in zwei Spalten zu verschieben, dass so etwas wie folgt aussehen:
UPDATE UserAttributes
SET str1 = SUBSTRING(Data, 1, STRPOS(Data, '~@~')),
str2 = SUBSTRING(Data, STRPOS(Data, '~@~')+3, LEN(Data)-(STRPOS(Data, '~@~')+3))
Aber ich kann nicht feststellen, dass jeder gleich strpos vorhanden ist.
Lösung
Andere Tipps
Die PATINDEX Funktion sollten Sie die Lage des Musters als Teil einer Zeichenfolge.
PATINDEX ( '%pattern%' , expression )
Wenn Sie Ihre Daten in den Spalten hier brauchen, ist, was ich benutze:
create FUNCTION [dbo].[fncTableFromCommaString] (@strList varchar(8000))
RETURNS @retTable Table (intValue int) AS
BEGIN
DECLARE @intPos tinyint
WHILE CHARINDEX(',',@strList) > 0
BEGIN
SET @intPos=CHARINDEX(',',@strList)
INSERT INTO @retTable (intValue) values (CONVERT(int, LEFT(@strList,@intPos-1)))
SET @strList = RIGHT(@strList, LEN(@strList)-@intPos)
END
IF LEN(@strList)>0
INSERT INTO @retTable (intValue) values (CONVERT(int, @strList))
RETURN
END
Just ersetzen '' in der Funktion mit dem Trennzeichen (oder vielleicht sogar parametrisieren it)