Tengo algunos datos de clientes que deben anonimizarse. Tengo customerIds que consta de números.

Por ejemplo:

CustomerID
3937487

Necesito intercambiar cada dígito con una alternativa, que debería ser suficiente para mis necesidades. Basado en la siguiente tabla de búsqueda

enter image description here

El único problema que tengo es cuando uso la función REEMPLAZAR en el campo:

REPLACE(REPLACE(CustomerID,2,9),9,6)

Lo que me da

CustomerID
3637487

Está cambiando el dígito 2 por un 9, luego el mismo 9 por un 6. Solo necesita reemplazar los dígitos UNA VEZ.

Como voy a cambiar millones de registros de una sola vez, el uso de tablas temporales no es posible desde una perspectiva de rendimiento. ¿Se puede hacer esto en una consulta, de forma recursiva?

0
dragonfury2 20 ene. 2021 a las 15:12

1 respuesta

La mejor respuesta

No puedo pensar en ninguna forma de lograr esto en una sola consulta. Si quisiera hacer esto, crearía una función similar a la de

CREATE FUNCTION [dbo].[AnonymiseId]
(
@Id [int]
)
RETURNS [int]
AS
BEGIN
    -- Declare the return variable here
    DECLARE @ResultVar int;

    DECLARE @substitutions nvarchar(10) = '7295380146';

    DECLARE @stringId nvarchar(100) = CONVERT(nvarchar(100), @Id);

    DECLARE @i int = 1

    DECLARE @substituteStringId nvarchar(100) = '';

    WHILE @i <= LEN(@stringID)
    BEGIN
        DECLARE @char nvarchar = SUBSTRING(@stringId, @i, 1);
        DECLARE @charValue int = CONVERT(int, @char);

        DECLARE @subsChar nvarchar = SUBSTRING(@substitutions, @charValue + 1, 1);

        SET @substituteStringId = CONCAT(@substituteStringId, @subsChar);

        SET @i = @i + 1
    END

    SET @ResultVar = CONVERT(int, @substituteStringId);

    -- Return the result of the function
    RETURN @ResultVar;

END
GO

Y luego utilícelo en la consulta

SELECT dbo.AnonymiseId(CustomerID) FROM ???
1
Jason Hunt 20 ene. 2021 a las 15:00