10 votes

SQL Server remplacement multiple avec table #temporaire

Je cherche à REMPLACER plusieurs caractères dans une requête SQL Server et je veux y parvenir via une table temporaire #temp au lieu d'une instruction REPLACE imbriquée. J'ai le code SQL ci-dessous et je veux obtenir un résultat comme

ABC
DEF
GHI

IF OBJECT_ID('tempdb..#temp') IS NOT NULL DROP TABLE #temp
IF OBJECT_ID('tempdb..#temp2') IS NOT NULL DROP TABLE #temp2

CREATE TABLE #temp
(
    STRING_TO_REPLACE NVARCHAR(5)
)
INSERT INTO #temp (STRING_TO_REPLACE)
VALUES            (' ')
                 ,('/')
                 ,('_') 

CREATE TABLE #temp2
(
    STRING_NAME NVARCHAR(5)
)

INSERT INTO #temp2 (STRING_NAME)
VALUES            ('A BC')
                 ,('D/EF')
                 ,('G_HI')

SELECT REPLACE(t2.STRING_NAME,(SELECT t1.STRING_TO_REPLACE   
                               FROM #temp t1),'') 
 FROM #temp2 t2

IF OBJECT_ID('tempdb..#temp') IS NOT NULL DROP TABLE #temp
IF OBJECT_ID('tempdb..#temp2') IS NOT NULL DROP TABLE #temp2

Je peux obtenir le résultat avec un remplacement imbriqué

SELECT REPLACE(REPLACE(REPLACE(t2.STRING_NAME,'_',''),'/',''),' ','')  FROM #temp2 t2

mais j'aimerais vraiment faire cela avec une table temporaire #temp. Quelqu'un pourrait-il m'aider sur cela. Lorsque j'essaie d'exécuter mon premier code, j'obtiens l'erreur suivante

Msg 512, Level 16, State 1, Line 23 Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= ,

, >= or when the subquery is used as an expression.

0voto

kami Points 112

J'ai trouvé le code ci-dessous sur stackoverflow qui semble plus proche de ce que j'essaie de réaliser mais je lutte pour comprendre comment je peux l'utiliser avec mon code

    declare @String varchar(max) = '(N_100-(6858)*(6858)*N_100/0_2)%N_35'

        --tableau contenant les valeurs à remplacer
        create table #Replace 
        (
            StringToReplace varchar(100) not null primary key clustered
            ,ReplacementString varchar(100) not null    
        )

        insert into #Replace (StringToReplace, ReplacementString)
        values ('+', '~')
            ,('-', '~')
            ,('*', '~')
            ,('/', '~')
            ,('%', '~')
            ,('(', '~')
            ,(')', '~')

        select @String = replace(@String, StringToReplace, ReplacementString)
        from #Replace a

        select @String

        drop table #Replace

ÉDIT par gofr1

CREATE FUNCTION replacement
(
    @String nvarchar(max)
)
RETURNS nvarchar(max) 
AS
BEGIN

    DECLARE @Replace TABLE (
        StringToReplace nvarchar(100),
        ReplacementString nvarchar(100)
    )

    INSERT INTO @Replace (StringToReplace, ReplacementString)
    VALUES ('+', '~')
        ,('-', '~')
        ,('*', '~')
        ,('/', '~')
        ,('%', '~')
        ,('(', '~')
        ,(')', '~')

    SELECT @String = replace(@String, StringToReplace, ReplacementString)
    FROM @Replace

    RETURN @String

END
GO

Ensuite, appelez-le :

SELECT dbo.replacement ('A B-C/d')

Sortie :

A B~C~d

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X