2017-12-19 2 views
0

Meine aktuelle Tabelle ist wie enter image description hereWie kann ich alle Werte in Tabelle dynamisch in SQL Server 2012 ersetzen?

wo UserId 14 Spalten ys_ar_item1-ys_ar_item14 für mehrere Kunden hat. Ich muss die Werte in dieser Tabelle ändern oder aktualisieren, so dass 0 durch 1 ersetzt werden sollte, 1 durch 2 ersetzt werden sollte, 2 durch 3 ersetzt werden sollte, bis 6 durch 7 ersetzt werden sollte, und nil sollte durch 0 ersetzt werden.

zum Beispiel: ys_ar_item1 31.245 sein sollte statt 20134.

Hier ist Beispieltabelle für 3 Spalten, wird es für alle Spalten, die 14 ist

enter image description here

Hinweis - es wäre in Ordnung, um eine neue Tabelle mit UserId und 14 Spalten zu erstellen.

+0

@Sami - ich alle Werte in allen Spalten der Tabelle zu ersetzen. – KulOmkar

+0

Sind 'Ys_Ar_Item1' ... Datentyp ist Varchar oder Int? – Sami

+0

Datentyp ist VARCHAR (MAX) – KulOmkar

Antwort

1

Wie bereits erwähnt, ist dies ein schlechtes Datenbankdesign. Aber Sie können die folgende Funktion versuchen, das gewünschte Ergebnis zu erhalten:

CREATE FUNCTION ReplaceNumbers 
(
    @str varchar(max) 
) 
RETURNS varchar(max) 
AS 
BEGIN 

DECLARE @result varchar(max) 
DECLARE @cnt int=1 
WHILE @cnt <= LEN(@str) 
    BEGIN 
     SET @result = CONCAT(@result, 
          CASE WHEN SUBSTRING(@str,@cnt,1) IN ('0','1','2','3','4','5','6') 
          THEN CAST(PARSE(SUBSTRING(@str,@cnt,1) AS int)+1 AS varchar) 
          ELSE SUBSTRING(@str,@cnt,1) END) 

     SET @cnt = @cnt + 1 
    END; 

RETURN REPLACE(@result, 'nil', '0') 
END 

es wie folgt verwendet:

UPDATE myTable SET ys_ar_item1=dbo.ReplaceNumbers(ys_ar_item1) 
1

Es ist wirklich schlechtes Design und Sie speichern Zahlen als Zeichenfolgen, die Dinge schwer macht, aber ich kann mir nur diese Funktionen mit IIF(), TRY_CAST() und REPLICATE():

CREATE TABLE Sample (
    UserID INT, 
    Ys_Ar_Item1 VARCHAR(10), 
    Ys_Ar_Item2 VARCHAR(10), 
    Ys_Ar_Item3 VARCHAR(10) 
    -- Other columns 
    ); 

INSERT INTO Sample VALUES 
(1, '20134', 'nil NULL', '02341'); 

SELECT UserID, 
     IIF(TRY_CAST(Ys_Ar_Item1 AS INT) IS NULL, '0', CAST(REPLICATE('1', LEN(Ys_Ar_Item1)) AS INT) + CAST(Ys_Ar_Item1 AS INT)) AS Ys_Ar_Item1, 
     IIF(TRY_CAST(Ys_Ar_Item2 AS INT) IS NULL, '0', CAST(REPLICATE('1', LEN(Ys_Ar_Item2)) AS INT) + CAST(Ys_Ar_Item2 AS INT)) AS Ys_Ar_Item2, 
     IIF(TRY_CAST(Ys_Ar_Item3 AS INT) IS NULL, '0', CAST(REPLICATE('1', LEN(Ys_Ar_Item3)) AS INT) + CAST(Ys_Ar_Item3 AS INT)) AS Ys_Ar_Item3 
FROM Sample; 

Hinweis:

In der Probe Daten, die Sie in Ihrer Frage als Bild angeben, gibt es keine Zahl> 6, diese Lösung wird fehlschlagen, wenn Sie solche Nummern haben.

Verwandte Themen