[Rozw] MSSQL - Zapytanie wildcard + join się krzaczy

Użytkowanie programu bazodanowego
szczur3k
Posty: 9
Rejestracja: pt paź 11, 2019 12:14 pm

[Rozw] MSSQL - Zapytanie wildcard + join się krzaczy

Post autor: szczur3k »

Trochę to wszystko skomplikowane, ale po kolei:

Są dwie bazy danych, jedna z Subiekta, i druga, załóżmy Towary. Zadaniem drugiej bazy jest uzupełnienie danych z Subiekta o pola których w nim nie ma. Złączenia następują po polu zawierającym symbol towaru. Tabela z bazy z Towary nie ma kolumny z nazwą towaru, bo ta siedzi już w subiekcie i ma być z niego zasysana. Podobnie np. kategorie towarów, mają być zasysane z subiekta. Czyli:

Kod: Zaznacz cały

SELECT "T"."Symbol", "ST"."tw_Nazwa" "Nazwa", "SG"."grt_Nazwa" "Kategoria" FROM "nasza"."dbo"."n_Towary" "T" 
    INNER JOIN "Subiekt"."dbo"."tw__Towar" "ST" 
        ON "T"."Symbol" = "ST"."tw_Symbol" 
    INNER JOIN "Subiekt"."dbo"."sl_GrupaTw" "SG"
        ON "ST"."tw_IdGrupa" = "SG"."grt_Id"
zmajstruje nam tabelę, gdzie będziemy mieli Symbol z naszej bazy, nazwę oraz nazwę kategorii z Subiekta oraz opis z naszej bazy.

I teraz problem: Takie samo zapytanie, ale pytające za pomocą zmiennej :VAR_SYMBOL o szukany symbol:

Kod: Zaznacz cały

SELECT "T"."Symbol", "ST"."tw_Nazwa" "Nazwa", "SG"."grt_Nazwa" "Kategoria" FROM "nasza"."dbo"."n_Towary" "T" 
    INNER JOIN "Subiekt"."dbo"."tw__Towar" "ST" 
        ON "T"."Symbol" = "ST"."tw_Symbol" 
    INNER JOIN "Subiekt"."dbo"."sl_GrupaTw" "SG"
        ON "ST"."tw_IdGrupa" = "SG"."grt_Id"
    WHERE ( UPPER ( "T"."Symbol" ) LIKE '%' + UPPER ( :VAR_SYMBOL ) + '%' OR UPPER ( :VAR_SYMBOL ) IS NULL )
Wywala błąd: Stan SQL: 07002 [Microsoft][SQL Server Native Client 11.0]COUNT field incorrect or syntax error.

Zapytanie trafiające do serwera różni się od tego co wpisuję w BASE:

Kod: Zaznacz cały

    ...
    WHERE ( 0 = 1 ) AND ( ( UPPER ( "T"."Symbol" ) LIKE ''%'' + UPPER ( @P1 ) + ''%'' OR UPPER ( @P2 ) IS NULL ) )
Przy procentach nie znajduje się cudzysłów a po dwa apostrofy. W momencie kiedy z palca odpalę to co przyszło z BASE dostaję błąd Msg 402
The data types varchar and varchar are incompatible in the modulo operator.
. Kiedy dwa apostrofy poprawię na pojedyncze dostaję pusty wynik. W momencie kiedy z polecenia wywalę WHERE lub złączenia, zapytanie działa jak należy.

Postanowiłem oszukać system i w formularzu zrobiłem dwa podformularze: w jednym zapytanie z :VAR_SYMBOL bez złączeń, a w drugim tylko złączenia. Efekt ten sam.

Poradzicie mi coś, bo pomysły się powoli kończą.

Edit.

Nie wiem co jest grane, napisałem od początku kod sql i tym razem działa.
Ostatnio zmieniony śr lis 06, 2019 2:37 pm przez szczur3k, łącznie zmieniany 1 raz.
Windows 10 (x64), Libre Office 6.2.7.1 (x86)
Jan_J
Posty: 4583
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: MSSQL - Zapytanie wildcard + join się krzaczy

Post autor: Jan_J »

Pojedynczy apostrof ' jest ogranicznikem danych tekstowych.
Podwójny apostrof " jest ogranicznikiem nazw systemowych encji.
Więc jest dobrze.

The data types varchar and varchar are incompatible in the modulo operator dotyczy fragmentu LIKE ''%'' co rozumiem następująco:
prawy argument operatora LIKE opisuje wzorzez tekstu. We wzorcu symbol % jest metaznakiem zastępującym grupę znaków. Tak by było w przypadku 'bla%bla' albo 'bla' || '%' || 'bla'.
Ale w ''%'' symbol % występuje poza tekstem, więc oznacza operację dzielenia modulo, a ta jak wiadomo jest niewykonalna na tekstach (w tym przypadku pustych).

Spróbowałbym zastąpić operator + operatorem łączenia tekstów ||
JJ
LO (24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
szczur3k
Posty: 9
Rejestracja: pt paź 11, 2019 12:14 pm

Re: MSSQL - Zapytanie wildcard + join się krzaczy

Post autor: szczur3k »

Co do zamiany '+' na '||', tak wyglądało zapytanie na początku i serwer wyrzucał błąd Incorrect syntax near '|'. Zgodnie z dokumentacją w TSQL konkatenację uzyskujemy właśnie za pomocą '+'. Podsumowując, polecenie bez złączeń działa bez problemu z pojedynczymi apostrofami i plusami. Schody zaczynają się w momencie, kiedy do zapytania dochodzą złączenia.
Windows 10 (x64), Libre Office 6.2.7.1 (x86)
Jan_J
Posty: 4583
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: [Rozw] MSSQL - Zapytanie wildcard + join się krzaczy

Post autor: Jan_J »

Nie wiem co jest grane, napisałem od początku kod sql i tym razem działa.
Nie jest całkiem ok, bo (a) nie wiadomo dlaczego, (b) czytelnicy w przyszłości nie odniosą pożytku.
Base to trudny przypadek. Ale najważniejsze, że udało się opanować problem.
JJ
LO (24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
szczur3k
Posty: 9
Rejestracja: pt paź 11, 2019 12:14 pm

Re: [Rozw] MSSQL - Zapytanie wildcard + join się krzaczy

Post autor: szczur3k »

W sumie racja. Problem rozwiązałem tak, że zrezygnowałem z łączenia tabel w dwóch bazach danych, a potrzebne dane są pobierane z tabel subiekta do mojej bazy za pomocą merge-a. Wiem, mało eleganckie, ale baza niewielka więc da się z tym żyć. Wniosek - base ma problem z jednoczesnym pobieraniem danych z dwóch baz mimo prawidłowych uprawnień itp.
Windows 10 (x64), Libre Office 6.2.7.1 (x86)
Jan_J
Posty: 4583
Rejestracja: pt maja 22, 2009 1:20 pm
Lokalizacja: Wrocław

Re: [Rozw] MSSQL - Zapytanie wildcard + join się krzaczy

Post autor: Jan_J »

szczur3k pisze:Wniosek - base ma problem z jednoczesnym pobieraniem danych z dwóch baz mimo prawidłowych uprawnień itp.
To mnie nie dziwi. W końcu jest to interfejs użytkowy bazy danych, a nie łącznik między bazami.
Ile razy potrzebowałem fuzję OpenOffice'a z PostgreSQL, najwygodniejsze okazywało się rozwiązanie Calc + makro Python, bez udziału Base. Przy tej technologii liczba `otwartych` baz nie ma znaczenia.
JJ
LO (24.2) ∙ Python (3.12|3.10) ∙ Unicode 15 ∙ LᴬTEX 2ε ∙ XML ∙ Unix tools ∙ Linux (Rocky|CentOS)
szczur3k
Posty: 9
Rejestracja: pt paź 11, 2019 12:14 pm

Re: [Rozw] MSSQL - Zapytanie wildcard + join się krzaczy

Post autor: szczur3k »

Tutaj akurat kwestia dotyczy "klikalnej" możliwości edycji wpisów w bazie za pomocą formularza w base. Ale zaciekawiłeś mnie, bo akurat siedzę nad jednym arkuszem który zaciąga dane z bazy za pomocą base-a i działa to średnio. Czyli rozumiem, że można do Calca zaciągnąć dane bezpośrednio z bazy, z pominięciem base? Możesz coś więcej napisać na ten temat?
Windows 10 (x64), Libre Office 6.2.7.1 (x86)
ODPOWIEDZ