Avatar billede entracore Nybegynder
10. januar 2002 - 11:56 Der er 16 kommentarer og
1 løsning

Split et ord

Hej

Jeg har følgende problemstilling.

- Jeg har en streng der indeholder legale karakterer.
  Declare @Legal_Char Varchar(55)
  Set @Legal_Char = \'ABCDEGFH....\'

- Jeg har en anden streng der bliver hentet fra en tabel. Denne kunne være: @Record = \'En_Record_Fra_En_Tabel\'

Sagen er nu den at jeg gerne vil lave det sådan i en Stored Procedure at @Record splittes op og de karakterer som ikke eksisterer i strengen @Legal_Char fjernes.

Hvordan er det lige jeg gør det?

Spørg hvis min forklaring ikke er tydelig nok.

På forhånd tak.
Avatar billede bennytordrup Nybegynder
10. januar 2002 - 12:14 #1
Som jeg forstår det, skal resultatet være @Record uden de tegn, som findes i @Legal_Char, right?

Hvilken SQL Server?
Avatar billede entracore Nybegynder
10. januar 2002 - 12:27 #2
benny.tordrup >> Det er korrekt forstået. Jeg anvender en SQL Server 2000
Avatar billede bennytordrup Nybegynder
10. januar 2002 - 12:35 #3
SQL Server har en streng-funktion Replace. Den har en SubString.

Kunsten bliver at løbe @Legal_Char igennem tegn for tegn og erstatte alle forekomster i @Record med en tom streng.
Avatar billede bennytordrup Nybegynder
10. januar 2002 - 12:35 #4
Hvis du kan vente til i aften, skal jeg gerne lave noget mere uddybende.
Avatar billede entracore Nybegynder
10. januar 2002 - 12:48 #5
benny.tordrup >> Jeg kan sagtens vente til i aften. Og det er korrekt at det jeg leder efter er noget kode der løber @Legal_Char og @Record igennem tegn for tegn.
Avatar billede tmceu Praktikant
11. januar 2002 - 07:57 #6
Du kunne også lave det som en funktion

CREATE  FUNCTION FixChars  (@inField varchar(200))
RETURNS varchar(200)
AS
BEGIN
    Set @InField =
        Replace(
        Replace(
        Replace(
        Replace(
        Replace(
        Replace(
        Replace(
        Replace(
        Replace(
        Replace(
        Replace(
        Replace(
        Replace(@InField, \'&\', \'\')
        , \'A\', \'\')
        , \'B\', \'\')
        , \'C\', \'\')
        , \'D\', \'\')
        , \'E\', \'\')
        , \'F\', \'\')
        , \'H\', \'\')
        , \'I\', \'\')
        , \'J\', \'\')
        , \'K\', \'\')
        , \'L\', \'\')
        , CHAR(13), \'\')
      RETURN(@InField)
END
Avatar billede entracore Nybegynder
11. januar 2002 - 10:10 #7
tmceu >> Det er en løsning - men den er ikke særlig pæn. Jeg havde forstillet mig at man laver en løkke også så validere strengen @Record i den. ;)
Avatar billede bennytordrup Nybegynder
11. januar 2002 - 10:12 #8
Det var også det, jeg ville, men jeg blev forstyrret af andres planer i går aftes :-)
Avatar billede entracore Nybegynder
11. januar 2002 - 10:50 #9
benny.tordrup >> Ville ud lave en løkke eller var det tmceu løsning du vil komme med?
Avatar billede bennytordrup Nybegynder
11. januar 2002 - 10:51 #10
Jeg ville lave en løkke
Avatar billede bennytordrup Nybegynder
11. januar 2002 - 10:52 #11
Den vil være mere fleksibel, da listen med legale chars kan variere per kald.

Hvordan skal den bruges? Skal den indgå i forespørgsler oder was?
Avatar billede entracore Nybegynder
11. januar 2002 - 10:59 #12
Proceduren skal ikke indgå i en forspørgsel, men eksekveres af et job.

Det jeg er igang med at lave er en indeksseringsrutine.
Avatar billede bennytordrup Nybegynder
11. januar 2002 - 11:01 #13
ok
Avatar billede entracore Nybegynder
14. januar 2002 - 22:27 #14
benny.tordrup >> Ikke for at stresse dig alt for meget - men ville du komme med en løsning ???
Avatar billede bennytordrup Nybegynder
14. januar 2002 - 22:48 #15
create procedure StripNonLegalChars
(
    @Legal_Chars    nvarchar(100),    -- Skal være lang nok til at indeholde alle gyldige tegn
    @Record        nvarchar(100)
)
as
    set nocount on

    declare @New    nvarchar(100)
    declare    @Idx    int
   
    set @Idx = 1
   
    set @New = \'\'
    while @Idx <= Len(@Record) begin
        if CharIndex(SubString(@Record, @Idx, 1), @Legal_Chars) > 0
            set @New = @New + SubString(@Record, @Idx, 1)
        set @Idx = @Idx+1
    end

    set nocount off   
    select @New
Avatar billede entracore Nybegynder
15. januar 2002 - 12:25 #16
benny.tordrup >> Det ser godt ud :) Jeg kigger lige på det når jeg kommer hjem i aften.
Avatar billede entracore Nybegynder
16. januar 2002 - 11:50 #17
Mange tak for hjælpen Benny ;)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester