2017-10-30 1 views
0

Ich habe diesen Code:aktualisiert eine SQL Server-Tabelle aus einer CTE und Case-Anweisung

WITH CTE AS 
(
    SELECT 
     LTRIM(RTRIM([EMP_ID])) AS empID 
    FROM 
     [SAMPLE].[dbo].[segments] 
) 
SELECT 
    (CASE WHEN LEN(LTRIM(RTRIM(EMPID))) = 5 
      THEN RIGHT(('100' + EMPID), 8) 
      WHEN LEN(LTRIM(RTRIM(EMPID))) = 6 
      THEN RIGHT(('10' + EMPID), 8) 
      WHEN LEN(EMPID) = 7 
      THEN RIGHT('10' + (LEFT(LTRIM(EMPID), 6)), 8) 
      ELSE empID 
    END) EMP_ID 
FROM CTE 

Was ich tun möchte, ist es, den oben genannten Zustand verwenden, um meine emp_id Spalt auf die neuen 8-stelligen IDs zu aktualisieren. Das Ausführen des Skripts gibt die IDs jetzt korrekt zurück, ich muss nur die Tabelle aktualisieren.

Ich habe versucht, die folgenden und alle es wurde alle IDs die gleichen

WITH CTE AS 
(
    SELECT 
     LTRIM(RTRIM([EMP_ID])) AS empID 
    FROM 
     [SAMPLE].[dbo].[segments] 
) 
UPDATE segments 
SET EMP_ID = (case when len(ltrim(rtrim(EMPID))) = 5 then right(('100' + EMPID),8) 
     when len(ltrim(rtrim(EMPID))) = 6 then right(('10' + EMPID),8) 
     when len(EMPID) = 7 then right('10'+(left(ltrim(EMPID),6)),8) 
     else empID 
     end) 
FROM CTE 

Was die für diese richtige UPDATE Anweisung zu verwenden ist tat gemacht?

+1

Warum nicht nur einfaches Update verwenden versuchen? Warum der CTE? – Eric

+0

Enthalten irgendwelche EmpIDs nicht-numerische Zeichen? –

+0

Oh, und wenn Sie bereits überprüft haben, die Länge einer Zeichenfolge ist 5 Zeichen und Sie vor 3, _Sie müssen die Zeichenfolge nicht wieder auf 8 zurückschneiden_. Gleich für 6 und 2. –

Antwort

0

Ohne CTE können Sie

UPDATE segments 
SET EMP_ID = (case when len(ltrim(rtrim(EMP_ID))) = 5 then right(('100' + EMP_ID),8) 
    when len(ltrim(rtrim(EMP_ID))) = 6 then right(('10' + EMP_ID),8) 
    when len(EMP_ID) = 7 then right('10'+(left(ltrim(EMP_ID),6)),8) 
    else emp_ID 
    end) 

versuchen ODER wenn Sie CTE verwenden möchten, können Sie

With CTE 
As 
(
SELECT ltrim(rtrim([EMP_ID])) as empIDTrim 
, Emp_ID 

FROM [SAMPLE].[dbo].[segments] 
) 
UPDATE CTE 
SET EMP_ID = (case when len(empIDTrim)= 5 
then right('100' + empIDTrim,8) 
    when len(empIDTrim)= 6 
then right('10' + empIDTrim ,8) 
    when len(empIDTrim) = 7 
    then right('10'+left(empIDTrim,6),8) 
    else empIDTrim 
    end) 
1

umfassen die Basisspalte in der common table expression und die cte direkt aktualisieren:

;with cte as (
    select 
     emp_id 
    , empid = '1'+replicate('0',7-len(ltrim(rtrim([emp_id]))))+ltrim(rtrim(emp_id)) 
    from segments 
    where len(ltrim(rtrim([emp_id]))) < 8 
) 

update cte set emp_id = empid; 

select * 
from segments; 

rextester Demo: http://rextester.com/YKO33009

kehrt:

+----------+ 
| emp_id | 
+----------+ 
| 88888888 | 
| 17777777 | 
| 10666666 | 
| 10055555 | 
| 10004444 | 
| 10000333 | 
| 10000022 | 
| 10000001 | 
+----------+ 

aus diesem Testaufbau:

create table segments (emp_id char(8)) 
insert into segments values 
('88888888') 
,('7777777') 
,('666666') 
,('55555') 
,('4444') 
,('333') 
,('22') 
,('1'); 
+0

Danke SqlZim für die Erklärung und den Tipp. Das hat auch gut funktioniert. Sehr geschätzt. – spittingfire

1

Wenn der am weitesten links stehenden 5 oder 6 Zeichen des beschnittenen emp_id alle numerisch sind, können Sie dies tun:

UPDATE [SAMPLE].[dbo].[segments] 
SET EMP_ID = cast(10000000 + cast(ltrim(rtrim(case when len(ltrim(rtrim(emp_id))) > 6 then left(ltrim(rtrim(emp_Id)),6) else ltrim(rtrim(emp_id)) end)) as int) as char(8)) 

Sie können dies weiter leichter zu verstehen, wenn man es in zwei Schritten tun:

UPDATE [SAMPLE].[dbo].[segments] 
SET Emp_ID = rtrim(ltrim(Emp_ID)) 

UPDATE [SAMPLE].[dbo].[segments] 
SET EMP_ID = cast(10000000 + cast(case when len(emp_id) > 6 then left(emp_Id,6) else emp_id end as int) as char(8)) 

Obwohl ich stark vermuten, auch das ist nicht notwendig, und Ihre EMP_ID Werte sind bereits getrimmt. Es kann möglicherweise noch einfacher werden, wenn Sie wissen, dass das 7-stellige Szenario auch numerisch ist.

Schließlich werde ich wirklich nervös über UPDATE Abfragen ohne WHERE. Es ist möglich, dass du es diesmal wirklich meinst ... aber es ist immer noch beängstigend zu rennen.

+0

Dank Joel Coehoorn, das funktioniert auch gut, sehr geschätzt. – spittingfire

+0

Ja, ich verstehe, aber das wird ein einmaliger Deal sein - wir verschieben alle EMP_IDs von 5,6,7 Ziffern auf 8 Ziffern. Als Ergebnis müssen alle historischen Daten, die ich habe, in die neuen 8-stelligen IDs umgewandelt werden. – sly123