Avatar billede mahyar Nybegynder
06. februar 2009 - 14:11 Der er 11 kommentarer og
1 løsning

Stored Procedure LIKE keyword???

Jeg har lavet en stored procedure som skal søge på nogle forskellige parametre. Men når jeg kører den så returnerer den hele tabellen. Dvs den søger ikke rigtig. Storedprocedruen er den nedenstående. Men når jeg kun kører med en LIKE keyword. dvs kun søger på en parameter, så fungerer det helt fint. Men jeg vil have den til at søge på alle parametrene.

ALTER PROCEDURE [dbo].[stp_FindFirma]

      @Navn  Nvarchar(50),                       
      @Adresse  Nvarchar(50),                                 
      @Postnr    Nvarchar(50),                       
      @Distrikt    Nvarchar(50) ,                         
      @Omraade        Nvarchar(50)  ,
      @Tlf        Nvarchar(50)

AS
BEGIN
    SELECT FirmaID, Navn, Adresse, Postnr, Distrikt, Email, Hjemmeside, CVR, Beskrivelse, Omraade, Tlf, Dato
FROM Firma
WHERE Adresse LIKE @Adresse + '%' OR Navn LIKE @Navn + '%' OR Postnr LIKE @Postnr + '%' OR Distrikt LIKE @Distrikt + '%'  OR Omraade LIKE @Omraade + '%' OR Tlf LIKE @Tlf + '%' AND Firma.Enabled = 1

END
Avatar billede aaberg Nybegynder
06. februar 2009 - 14:19 #1
Det der højest sandsynligt sker, er at en af parametrene ikke er angivet, og du dermed har en "OR kolonne LIKE '%'". Det vil returnere hele tabellen.

Jeg ville nok have fjernet alle %-tegn fra SP'en, og sat dem ind fra applikationen, hvis parameteren ikke er blank.
Avatar billede mahyar Nybegynder
06. februar 2009 - 14:36 #2
Tak for svaret...vil du komme med et lille eks. på hvordan man kan gøre det?...
Avatar billede mahyar Nybegynder
06. februar 2009 - 14:38 #3
metoden som jeg bruger til at kalde ned til databasen ser således ud:
public DataTable FindFirma(Firma firma)
    {
        Database ConnectionStringSurfTown = DatabaseFactory.CreateDatabase();
        DbCommand command = ConnectionStringSurfTown.GetStoredProcCommand("stp_FindFirma");


        ConnectionStringSurfTown.AddInParameter(command, "@Navn", DbType.String, firma.Firmanavn);
        ConnectionStringSurfTown.AddInParameter(command, "@Adresse", DbType.String, firma.Adresse);
        ConnectionStringSurfTown.AddInParameter(command, "@Postnr", DbType.String, firma.Postnr);
        ConnectionStringSurfTown.AddInParameter(command, "@Distrikt", DbType.String, firma.Distrikt);
        ConnectionStringSurfTown.AddInParameter(command, "@Omraade", DbType.String, firma.Omraade);
        ConnectionStringSurfTown.AddInParameter(command, "@Tlf", DbType.String, firma.Tlf);



        DataSet DatasetFirma = new DataSet();
        ConnectionStringSurfTown.LoadDataSet(command, DatasetFirma, "Firma");

        DataTable dataTable = DatasetFirma.Tables["Firma"];
        return dataTable;
    }
Avatar billede aaberg Nybegynder
06. februar 2009 - 14:57 #4
Det ligner C#?

Hvis det er C#, kan du gøre sådan:

ConnectionStringSurfTown.AddInParameter(command, "@Navn", DbType.String, string.IsNullOrEmpty(firma.Firmanavn) ? "" : firma.Firmanavn + "%");

og så gentage det for alle parametrene.

Hvis det er Java, ved jeg ikke helt hvordan du gøre tilsvarende, men det er sikkert noget lignende:

ConnectionStringSurfTown.AddInParameter(command, "@Navn", DbType.String, firma.Firmanavn == "" ? "" : firma.Firmanavn + "%");
Avatar billede arne_v Ekspert
06. februar 2009 - 15:08 #5
Enten aabergs loesning med at addde % paa C# siden, hvis der er nogle data og ellers blank streng (eneste ulempe er hvis vaerdien i
databasen er blank) eller i SP:

OR (felt IS NOT NULL AND felt <> '' AND felt LIKE felt + '%')
Avatar billede arne_v Ekspert
06. februar 2009 - 15:09 #6
Det ville se lidt anderleds ud i Java, men er grundliggend det samme:

cstmt.setString(1, firma.Firmanavn == "" ? "" : firma.Firmanavn + "%");
Avatar billede mahyar Nybegynder
06. februar 2009 - 15:42 #7
Tak for alle jeres svare.

Kære aaberg_cc

Venligst send et svar så jeg kan overføre points til dig.
Avatar billede aaberg Nybegynder
06. februar 2009 - 17:30 #8
:-)
Avatar billede mahyar Nybegynder
10. februar 2009 - 13:15 #9
Hej igen

Jeg troede i starten at aaberg's løsning gav det rigtige resultat. Men nu hvor jeg har oprettet flere poster i tabellen, har jeg fundet ud af at den faktisk ikke søger rigtig. Den smider hele tabellens indhold ud. Er der slet ikke en måde, hvor man kan have en multiple LIKE keyword på en effektiv måde?

C# koden:

public DataTable FindFirma(Firma firma)
    {
        Database Firmaviser = DatabaseFactory.CreateDatabase();
        DbCommand command = Firmaviser.GetStoredProcCommand("stp_FindFirma");

Firmaviser.AddInParameter(command, "@Navn", DbType.String, string.IsNullOrEmpty(firma.Firmanavn) ? "" : firma.Firmanavn + "%");
        Firmaviser.AddInParameter(command, "@Adresse", DbType.String, string.IsNullOrEmpty(firma.Adresse) ? "" :  firma.Adresse + "%");
        Firmaviser.AddInParameter(command, "@Postnr", DbType.String, string.IsNullOrEmpty(firma.Postnr) ? "" : firma.Postnr + "%");
        Firmaviser.AddInParameter(command, "@Distrikt", DbType.String, string.IsNullOrEmpty(firma.Distrikt) ? "" :  firma.Distrikt + "%");
        Firmaviser.AddInParameter(command, "@Omraade", DbType.String, string.IsNullOrEmpty(firma.Omraade) ? "" :  firma.Omraade + "%");
        Firmaviser.AddInParameter(command, "@Tlf", DbType.String, string.IsNullOrEmpty(firma.Tlf) ? "" : firma.Tlf + "%");
        Firmaviser.AddInParameter(command, "@Enabled", DbType.Boolean, true);

DataSet DatasetFirma = new DataSet();
        Firmaviser.LoadDataSet(command, DatasetFirma, "Firma");

        DataTable dataTable = DatasetFirma.Tables["Firma"];
        return dataTable;
    }



Stored Proceuren:

ALTER PROCEDURE [dbo].[stp_FindFirma]

      @Navn  Nvarchar(50),                       
      @Adresse  Nvarchar(50),                                 
      @Postnr    Nvarchar(50),                       
      @Distrikt    Nvarchar(50) ,                         
      @Omraade        Nvarchar(50)  ,
      @Tlf        Nvarchar(50),
        @Enabled bit

AS
BEGIN
    SELECT FirmaID, Navn, Adresse, Postnr, Distrikt, Email, Hjemmeside, CVR, Beskrivelse, Omraade, Tlf, Dato
FROM Firma
WHERE  Navn LIKE @Navn OR Adresse LIKE @Adresse OR Navn LIKE @Navn OR Postnr LIKE @Postnr OR Distrikt LIKE @Distrikt OR Omraade LIKE @Omraade  OR Tlf LIKE @Tlf AND Firma.Enabled = @Enabled


END
Avatar billede aaberg Nybegynder
10. februar 2009 - 13:31 #10
Det burde virke. Jeg har lige testet noget tilsvarende i en af mine SQL Server tabeller, og der virker det fint med flere LIKE.

Har du prøvet at debugge dig ned igennem koden, for at tjekke at der ikke kommer et '%' ind i en af de tomme parametre?
Avatar billede mahyar Nybegynder
10. februar 2009 - 13:37 #11
Jeg fandt fejlen. WHERE sætningen skal skrives således med paranteser:

WHERE  Firma.Enabled = @Enabled AND
( Navn LIKE @Navn OR Adresse LIKE @Adresse OR Navn LIKE @Navn OR Postnr LIKE @Postnr OR Distrikt LIKE @Distrikt OR Omraade LIKE @Omraade  OR Tlf LIKE @Tlf )


Nu søger den rigtig :)
Avatar billede aaberg Nybegynder
10. februar 2009 - 13:44 #12
super :-)
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



IT-JOB

Udviklings- og Forenklingsstyrelsen

Generalist til PMO

Udviklings- og Forenklingsstyrelsen

Business Analysts til samfundsvigtige it-projekter

Erhvervsakademi Aarhus

Underviser til it-teknologuddannelsen

Udviklings- og Forenklingsstyrelsen

Udvikler til procesapplikationer