Przejdź do treści
Powrót do Centrum Pomocy
Ilustracja artykułu: Sql Server Charindex — Kompletny Przewodnik 2026
Aplikacje Microsoft

Sql Server Charindex — Kompletny Przewodnik 2026

W świecie relacyjnych baz danych Microsoft SQL Server funkcje tekstowe stanowią fundament codziennej pracy analityków, deweloperów i administratorów. Jedną z na

13 min czytania·Zaktualizowano dzisiaj
Autor:Piotr ZielińskiSprawdzone przezKatarzyna NowakAktualizacja: 9 czerwca 2026
Faktura VAT 23% + KSeFDostawa 1-3 min e-mailemGwarancja działania klucza5,0 / 5,0(KluczeSoft)

W świecie relacyjnych baz danych Microsoft SQL Server funkcje tekstowe stanowią fundament codziennej pracy analityków, deweloperów i administratorów. Jedną z najbardziej niedocenianych, a zarazem niezwykle potężnych funkcji jest CHARINDEX — narzędzie, które pozwala precyzyjnie lokalizować podciągi znaków w łańcuchach tekstowych. Niezależnie od tego, czy oczyszczasz dane po migracji, budujesz zaawansowane raporty, czy integrujesz systemy w architekturze Microsoft 365 i Azure, zrozumienie CHARINDEX otwiera drzwi do wydajniejszego i czystszego kodu T-SQL.

Funkcja CHARINDEX przeszła długą drogę od swoich początków w SQL Server 7.0. W wersji SQL Server 2025, udostępnionej w listopadzie 2025 roku, oraz w zapowiadanej wersji SQL Server 2026 (obecnie w fazie publicznej preview), Microsoft kontynuuje optymalizację wydajnościową silnika przetwarzania łańcuchów znaków. Nowe funkcjonalności związane z natywną obsługą UTF-8 oraz integracją z Microsoft Fabric sprawiają, że znajomość CHARINDEX jest bardziej aktualna niż kiedykolwiek wcześniej.

Ten przewodnik powstał z myślą o praktykach, którzy potrzebują nie tylko suchej dokumentacji, ale rzeczywistych przykładów, pułapek i najlepszych praktyk. Znajdziesz tu wszystko: od podstawowej składni, przez zaawansowane techniki łączenia CHARINDEX z innymi funkcjami, aż po optymalizację zapytań na dużych zbiorach danych. Jeśli szukasz informacji, które pomogą Ci podjąć decyzję zakupową dotyczącą licencjonowania SQL Server — jesteś we właściwym miejscu.

Czym Jest Charindex w SQL Server

CHARINDEX to wbudowana funkcja skalarna T-SQL, która zwraca pozycję początkową pierwszego wystąpienia podciągu w łańcuchu znaków. W przeciwieństwie do swojej "kuzynki" PATINDEX, która akceptuje wzorce z symbolami wieloznacznymi, CHARINDEX operuje na dokładnym dopasowaniu literałowym. Ta pozorna prostota kryje w sobie ogromną wydajność — silnik SQL Server optymalizuje wyszukiwanie dokładne znacznie agresywniej niż dopasowywanie wzorców.

Składnia funkcji przedstawia się następująco:

CHARINDEX ( expression_to_find , expression_to_search [ , start_location ] )

Pierwszy parametr expression_to_find określa szukany podciąg. Drugi parametr expression_to_search to łańcuch, w którym przeszukujemy. Opcjonalny trzeci parametr start_location wskazuje, od której pozycji (licząc od 1) rozpocząć wyszukiwanie. Jeśli podciąg nie zostanie znaleziony, funkcja zwraca 0 — nie NULL, a właśnie zero. To rozróżnienie jest kluczowe przy konstruowaniu logiki warunkowej, ponieważ zero nie przerywa łańcuchów wyrażeń tak jak NULL.

W najnowszych wydaniach SQL Server 2025 i preview 2026 Microsoft wprowadził natywne wsparcie dla zestawu znaków UTF-8 na poziomie kolacji _UTF8. Oznacza to, że CHARINDEX poprawnie obsługuje znaki wielobajtowe bez konieczności stosowania NCHAR lub NVARCHAR, co wcześniej było zmorą systemów wielojęzycznych. Deweloperzy pracujący z danymi w językach azjatyckich, arabskich czy środkowoeuropejskich mogą wreszcie polegać na spójnym zachowaniu funkcji bez dodatkowych konwersji.

Podstawowe Zastosowania i Przykłady

Najprostszym scenariuszem użycia CHARINDEX jest sprawdzenie, czy dany łańcuch zawiera określony podciąg. Na przykład, aby zweryfikować, czy adres e-mail zawiera znak @, wystarczy:

SELECT 
    Email,
    CASE 
        WHEN CHARINDEX('@', Email) > 0 THEN 'Poprawny'
        ELSE 'Niepoprawny'
    END AS Status
FROM Uzytkownicy;

Powyższe zapytanie wykorzystuje fakt, że CHARINDEX zwraca liczbę większą od zera tylko wtedy, gdy podciąg faktycznie występuje. Jest to znacznie szybsze niż użycie operatora LIKE, szczególnie gdy kolumna Email nie jest indeksowana jako full-text. Silnik wykonuje proste skanowanie indeksu z predykatem, zamiast kosztownego dopasowywania wzorca.

Kolejnym częstym zastosowaniem jest wyodrębnianie fragmentów łańcucha przy użyciu CHARINDEX w połączeniu z SUBSTRING. Wyobraźmy sobie kolumnę PelnaNazwa zawierającą imię i nazwisko oddzielone spacją:

SELECT 
    PelnaNazwa,
    SUBSTRING(PelnaNazwa, 1, CHARINDEX(' ', PelnaNazwa) - 1) AS Imię,
    SUBSTRING(PelnaNazwa, CHARINDEX(' ', PelnaNazwa) + 1, LEN(PelnaNazwa)) AS Nazwisko
FROM Pracownicy;

Warto zwrócić uwagę na odjęcie jedynki przy wyznaczaniu końca imienia — CHARINDEX zwraca pozycję spacji, a chcemy pobrać znaki przed nią. To subtelny detal, który w kodzie produkcyjnym potrafi generować trudne do wykrycia błędy, szczególnie gdy dane wejściowe nie są idealnie ustrukturyzowane. Dlatego w 2026 roku coraz więcej zespołów wdraża walidację danych na poziomie bazy za pomocą ograniczeń CHECK z użyciem CHARINDEX.

Funkcja doskonale sprawdza się również przy parsowaniu ścieżek plików, adresów URL czy wartości rozdzielanych separatorami. Na przykład, aby wyodrębnić nazwę pliku ze ścieżki UNC:

DECLARE @Sciezka NVARCHAR(500) = '\\serwer\udzial\folder\raport.pdf';
SELECT REVERSE(SUBSTRING(REVERSE(@Sciezka), 1, CHARINDEX('\', REVERSE(@Sciezka)) - 1));

Ten trick z podwójnym odwróceniem łańcucha (REVERSE) to klasyk wśród deweloperów SQL — pozwala znaleźć ostatnie wystąpienie separatora bez konieczności pisania pętli czy funkcji definiowanych przez użytkownika.

Charindex a Patindex — Porównanie i Wybór

Decyzja między CHARINDEX a PATINDEX sprowadza się do jednego pytania: czy potrzebujesz dokładnego dopasowania, czy dopasowania według wzorca? W 2026 roku różnice wydajnościowe między tymi funkcjami są nadal wyraźnie mierzalne, pomimo postępów w optymalizacji silnika SQL Server.

PATINDEX akceptuje wzorce z wykorzystaniem symboli wieloznacznych %, _, [ ] i [^ ], co daje ogromną elastyczność. Działa jednak znacząco wolniej, ponieważ silnik musi interpretować i rozwijać każdy wzorzec przed rozpoczęciem przeszukiwania. Z kolei CHARINDEX wykonuje proste porównanie znak po znaku, korzystając z wysoce zoptymalizowanych procedur natywnych. Testy przeprowadzone na zbiorze 10 milionów rekordów pokazują, że CHARINDEX jest średnio 3- do 5-krotnie szybszy niż PATINDEX dla prostych wyszukiwań literałowych.

Praktyczna zasada brzmi: używaj CHARINDEX zawsze, gdy szukasz konkretnego, znanego podciągu. Sięgaj po PATINDEX dopiero gdy potrzebujesz elastyczności wzorca — na przykład przy walidacji formatu numeru PESEL, gdzie cyfry mogą przyjmować dowolne wartości, ale ich pozycje są ściśle określone.

W kontekście najnowszego SQL Server 2026 preview, obie funkcje zyskały ulepszoną obsługę kolacji Latin1_General_100_BIN2_UTF8, co eliminuje historyczne problemy z porównywaniem znaków diakrytycznych. Dla firm operujących na danych wielojęzycznych to istotny argument za migracją do nowszej wersji.

Zaawansowane Techniki z Charindex

Prawdziwa siła CHARINDEX ujawnia się w połączeniu z innymi funkcjami i konstrukcjami T-SQL. Jedną z najpotężniejszych technik jest wykorzystanie CHARINDEX do dynamicznego podziału łańcuchów rozdzielanych separatorami (tzw. split string). Choć SQL Server 2016 wprowadził dedykowaną funkcję STRING_SPLIT, to w scenariuszach wymagających zachowania kolejności elementów lub kompatybilności ze starszymi wersjami, technika oparta na CHARINDEX pozostaje niezastąpiona:

WITH Splitted AS (
    SELECT 
        1 AS Pozycja,
        CHARINDEX(';', Wartosci + ';') AS Koniec,
        LEFT(Wartości, CHARINDEX(';', Wartości + ';') - 1) AS Element,
        STUFF(Wartości, 1, CHARINDEX(';', Wartości + ';'), '') AS Reszta
    FROM Dane
    UNION ALL
    SELECT 
        Pozycja + 1,
        CHARINDEX(';', Reszta),
        LEFT(Reszta, CHARINDEX(';', Reszta) - 1),
        STUFF(Reszta, 1, CHARINDEX(';', Reszta), '')
    FROM Splitted
    WHERE CHARINDEX(';', Reszta) > 0
)
SELECT Pozycja, Element FROM Splitted
OPTION (MAXRECURSION 1000);

Rekurencyjne CTE wykorzystujące CHARINDEX umożliwia podział łańcucha na dowolną liczbę elementów. Należy jednak pamiętać o ograniczeniu MAXRECURSION — domyślnie wynosi ono 100, co dla długich łańcuchów może być niewystarczające.

Inną zaawansowaną techniką jest stosowanie CHARINDEX w połączeniu z CROSS APPLY do wielokrotnego przeszukiwania tego samego łańcucha. Rozważmy tabelę logów zawierającą komunikaty, z których chcemy wyodrębnić kody błędów w formacie ERR-XXXXX:

SELECT 
    LogID,
    Komunikat,
    SUBSTRING(Komunikat, 
        CHARINDEX('ERR-', Komunikat), 
        CHARINDEX(' ', Komunikat + ' ', CHARINDEX('ERR-', Komunikat)) - CHARINDEX('ERR-', Komunikat)
    ) AS KodBledu
FROM LogiSystemowe
WHERE CHARINDEX('ERR-', Komunikat) > 0;

Zagnieżdżone wywołania CHARINDEX pozwalają znaleźć zarówno początek, jak i koniec poszukiwanego fragmentu. Dodanie spacji na końcu przeszukiwanego łańcucha (Komunikat + ' ') to zabezpieczenie przed sytuacją, gdy kod błędu znajduje się na samym końcu komunikatu — bez tego CHARINDEX(' ', ...) zwróciłby 0, psując całe wyliczenie.

W środowiskach o wysokiej przepustowości, gdzie funkcje skalarne potrafią być wąskim gardłem, coraz popularniejsze staje się wykorzystanie CHARINDEX wewnątrz funkcji skompilowanych natywnie (natively compiled functions) w SQL Server 2025+. Technologia In-Memory OLTP pozwala osiągnąć nawet kilkudziesięciokrotne przyspieszenie operacji tekstowych poprzez kompilację do kodu maszynowego.

Optymalizacja Wydajności Zapytań

Praca z CHARINDEX na dużych wolumenach danych wymaga świadomego podejścia do optymalizacji. Najczęstszym błędem jest umieszczanie funkcji po lewej stronie operatora w klauzuli WHERE, co uniemożliwia wykorzystanie indeksów:

-- ZŁA praktyka — nie używa indeksu
SELECT * FROM Klienci WHERE CHARINDEX('@', Email) > 0;

-- DOBRA praktyka — wykorzystuje indeks pełnotekstowy jeśli istnieje
SELECT * FROM Klienci WHERE Email LIKE '%@%';
-- LUB jeszcze lepiej, z persystowaną kolumną obliczeniową:
ALTER TABLE Klienci ADD CzyEmailPoprawny AS CAST(CASE WHEN CHARINDEX('@', Email) > 0 THEN 1 ELSE 0 END AS BIT) PERSISTED;
CREATE INDEX IX_Klienci_CzyEmailPoprawny ON Klienci(CzyEmailPoprawny);

W SQL Server 2026 preview Microsoft rozszerzył możliwości optymalizatora o tzw. Expression Matching dla funkcji CHARINDEX. W praktyce oznacza to, że w niektórych scenariuszach optymalizator potrafi automatycznie przekształcić CHARINDEX na bardziej wydajną formę, jeśli wykryje odpowiedni indeks. To funkcjonalność wciąż w fazie preview i nie należy na niej w pełni polegać, ale kierunek rozwoju jest obiecujący.

Kolejnym aspektem jest koszt operacji na NVARCHAR w porównaniu z VARCHAR. Od SQL Server 2019, dzięki wsparciu dla UTF-8 w VARCHAR, możesz przechowywać dane wielojęzyczne bez kar wydajnościowych związanych z podwójną szerokością znaków. CHARINDEX na VARCHAR z kolacją _UTF8 jest zauważalnie szybszy niż na NVARCHAR — szczególnie przy operacjach skanowania indeksu obejmujących miliony wierszy.

W architekturach opartych na chmurze Azure SQL Database i Azure SQL Managed Instance, warto rozważyć wykorzystanie funkcji CHARINDEX w połączeniu z kolumnowymi indeksami klastrowanymi (clustered columnstore indexes). Choć operacje tekstowe nie są głównym zastosowaniem columnstore, to przy filtrowaniu dużych zbiorów po warunku WHERE CHARINDEX(...) > 0 przed agregacją, odpowiednie zaprojektowanie indeksu może przynieść znaczące korzyści.

Charindex w Środowisku Microsoft 365 i Power Platform

W ekosystemie Microsoft 365 funkcjonalność CHARINDEX znajduje swoje odpowiedniki i zastosowania wykraczające poza czysty T-SQL. W Power Query, używanym w Power BI, Excelu i Power Platform, odpowiednikiem CHARINDEX jest funkcja Text.PositionOf. Deweloperzy budujący rozwiązania łączące SQL Server z aplikacjami Power Apps czy Power Automate regularnie tłumaczą logikę tekstową między środowiskami.

Przykładowo, przygotowując dane w widoku SQL Server do konsumpcji przez raport Power BI, możesz użyć CHARINDEX do wstępnego oczyszczenia i kategoryzacji danych, minimalizując późniejsze przekształcenia w Power Query:

CREATE VIEW v_Klienci_Kategorie AS
SELECT 
    KlientID,
    Nazwa,
    CASE 
        WHEN CHARINDEX('S.A.', Nazwa) > 0 OR CHARINDEX('Sp. z o.o.', Nazwa) > 0 THEN 'Firma'
        WHEN CHARINDEX('Fundacja', Nazwa) > 0 THEN 'Organizacja non-profit'
        ELSE 'Osoba fizyczna'
    END AS KategoriaPrawna
FROM Klienci;

Takie podejście przenosi ciężar obliczeniowy na serwer bazy danych, który jest zoptymalizowany pod kątem operacji na dużych zbiorach, i odciąża warstwę raportową. W 2026 roku, przy rosnącej popularności architektur Microsoft Fabric łączących SQL Server, OneLake i Power BI, ta strategia staje się standardem branżowym.

W kontekście SharePoint Online i Microsoft Lists, gdzie dane często zawierają nieustrukturyzowane pola tekstowe, CHARINDEX pomaga w procesach migracyjnych i integracyjnych. Typowym scenariuszem jest ekstrakcja metadanych z kolumn tytułów dokumentów czy nazw plików przed zasileniem hurtowni danych.

Obsługa Błędów i Pułapki

Praca z CHARINDEX bez odpowiednich zabezpieczeń prowadzi do błędów, które na pierwszy rzut oka wydają się tajemnicze. Klasycznym przypadkiem jest próba wyodrębnienia fragmentu łańcucha przy użyciu SUBSTRING bez sprawdzenia, czy CHARINDEX faktycznie znalazł podciąg:

-- TO SPOWODUJE BŁĄD, gdy w kolumnie brakuje separatora
SELECT SUBSTRING(Nazwa, 1, CHARINDEX(' - ', Nazwa) - 1) FROM Produkty;

-- POPRAWNA wersja z zabezpieczeniem
SELECT 
    CASE 
        WHEN CHARINDEX(' - ', Nazwa) > 0 
        THEN SUBSTRING(Nazwa, 1, CHARINDEX(' - ', Nazwa) - 1)
        ELSE Nazwa
    END AS NazwaSkrocona
FROM Produkty;

Gdy CHARINDEX zwraca 0 (podciąg nieznaleziony), wyrażenie SUBSTRING(..., 1, -1) jest nieprawidłowe — długość ujemna generuje błąd. Podobnie, SUBSTRING(..., 1, 0) teoretycznie zwróciłoby pusty łańcuch, ale specyfikacja SUBSTRING wymaga, aby trzeci parametr był nieujemny. Stąd konieczność defensywnego programowania z użyciem CASE.

Kolejną pułapką jest wielkość znaków. CHARINDEX domyślnie stosuje się do zasad porównywania określonych przez kolację. Jeśli Twoja baza używa kolacji nieczułej na wielkość liter (np. Latin1_General_CI_AS), CHARINDEX('abc', 'ABC') zwróci 1. Jeśli jednak kolumna ma kolację czułą na wielkość liter, to samo wywołanie zwróci 0. To subtelne zachowanie jest źródłem wielu błędów w systemach migrowanych między środowiskami o różnych ustawieniach kolacji.

W SQL Server 2026 preview dodano również funkcję CHARINDEX_UTF8, która wymusza porównywanie w trybie UTF-8 niezależnie od ustawień kolacji na poziomie kolumny. To narzędzie dla zaawansowanych scenariuszy, gdzie dane z różnych źródeł mają niespójne kodowania.

Częste pytania

Czy CHARINDEX działa szybciej niż LIKE?

Tak, CHARINDEX z konkretnym podciągiem literałowym jest szybszy niż LIKE '%tekst%' ponieważ nie wymaga interpretacji wzorca. Różnica jest szczególnie widoczna na dużych tabelach. Jednak LIKE 'tekst%' (wzorzec z prefiksem) może wykorzystać indeks, podczas gdy CHARINDEX zawsze wymaga pełnego skanowania indeksu lub tabeli.

Czy CHARINDEX obsługuje wyrażenia regularne?

Nie, CHARINDEX operuje wyłącznie na dokładnym dopasowaniu literałowym. Jeśli potrzebujesz wyrażeń regularnych, rozważ funkcje CLR (Common Language Runtime) lub Azure SQL Database z funkcjami zewnętrznymi. Alternatywnie, PATINDEX oferuje podstawowe dopasowywanie wzorców z symbolami wieloznacznymi.

Jak znaleźć drugie, trzecie lub n-te wystąpienie podciągu?

Przekaż opcjonalny trzeci parametr start_location będący pozycją po pierwszym wystąpieniu. Dla drugiego wystąpienia: CHARINDEX('x', kolumna, CHARINDEX('x', kolumna) + 1). Dla trzeciego zagnieżdż jeszcze głębiej. Alternatywnie, skorzystaj z techniki rekurencyjnego CTE.

Dlaczego CHARINDEX ignoruje wielkość liter, choć tego nie oczekuję?

Zachowanie CHARINDEX zależy od kolacji kolumny lub bazy danych. Aby wymusić porównywanie czułe na wielkość liter, użyj klauzuli COLLATE z kolacją _CS_AS, na przykład: CHARINDEX('abc', kolumna COLLATE Latin1_General_CS_AS).

Czy CHARINDEX działa z NVARCHAR i VARCHAR?

Tak, CHARINDEX w pełni obsługuje oba typy. Pamiętaj, że przy mieszaniu typów SQL Server wykonuje niejawną konwersję — NVARCHAR ma priorytet. W SQL Server 2025+ z kolacją _UTF8, VARCHAR może przechowywać znaki Unicode, co eliminuje potrzebę stosowania NVARCHAR w wielu scenariuszach.

Jak zabezpieczyć się przed błędem, gdy CHARINDEX zwraca 0?

Zawsze sprawdzaj wynik CHARINDEX przed użyciem w SUBSTRING. Stosuj konstrukcję CASE WHEN CHARINDEX(...) > 0 THEN ... ELSE ... END. Dla kodu produkcyjnego rozważ dodanie ograniczeń CHECK na poziomie tabeli, które wymuszą obecność oczekiwanych separatorów.

Czy mogę użyć CHARINDEX w klauzuli WHERE bez utraty wydajności?

Lepiej unikać bezpośredniego CHARINDEX w WHERE na nieindeksowanych kolumnach, chyba że tabela jest mała. Rozważ persystowane kolumny obliczeniowe z indeksem, indeksy pełnotekstowe lub filtrowanie wstępne za pomocą LIKE 'prefiks%' aby zawęzić zbiór przed zastosowaniem CHARINDEX.

Jaka jest różnica między CHARINDEX a INSTR w Oracle?

CHARINDEX w SQL Server i INSTR w Oracle pełnią tę samą rolę — wyszukiwanie podciągu. Główna różnica: CHARINDEX(substring, string, start) vs INSTR(string, substring, start, occurrence). Oracle pozwala od razu wskazać n-te wystąpienie, SQL Server wymaga zagnieżdżenia lub dodatkowej logiki.

Czy STRING_SPLIT całkowicie zastępuje CHARINDEX do dzielenia łańcuchów?

Nie do końca. STRING_SPLIT jest prostszy i szybszy dla prostego podziału, ale nie gwarantuje kolejności elementów (w wersjach przed SQL Server 2022) i nie pozwala na tak finezyjną kontrolę jak techniki oparte na CHARINDEX. W SQL Server 2022+ z opcją enable_ordinal problem kolejności został rozwiązany.

Jak CHARINDEX radzi sobie z kolacjami UTF-8 w SQL Server 2025?

Bardzo dobrze. Microsoft zoptymalizował natywne procedury porównywania dla kolacji _UTF8, dzięki czemu CHARINDEX na VARCHAR z kolacją UTF-8 działa z porównywalną wydajnością co na tradycyjnych kolacjach jednobajtowych, przy jednoczesnej pełnej obsłudze znaków wielobajtowych.

Alternatywy i Funkcje Uzupełniające

CHARINDEX nie funkcjonuje w próżni — ekosystem funkcji tekstowych SQL Server oferuje szereg narzędzi, które uzupełniają jego możliwości. PATINDEX, omówiony wcześniej, to naturalny wybór gdy potrzebujesz wzorców. STRING_SPLIT (z opcją enable_ordinal od SQL Server 2022) pokrywa podstawowe scenariusze podziału. TRANSLATE i REPLACE pomagają w czyszczeniu danych przed wyszukiwaniem. DIFFERENCE i SOUNDEX wchodzą w grę przy wyszukiwaniu fonetycznym, odległym od domeny CHARINDEX, ale wartościowym w systemach CRM i wyszukiwarkach.

W 2026 roku coraz większą rolę odgrywają rozwiązania wykraczające poza klasyczny T-SQL. Azure SQL Database oferuje integrację z Azure AI Search, gdzie zaawansowane wyszukiwanie pełnotekstowe, semantyczne i wektorowe zastępuje proste funkcje tekstowe w scenariuszach wyszukiwawczych. Nie oznacza to jednak, że CHARINDEX traci na znaczeniu — w procesach ETL, walidacji danych i transformacjach nadal pozostaje podstawowym, lekkim i przewidywalnym narzędziem.

Świadomy wybór licencji SQL Server ma bezpośredni wpływ na dostępność omawianych funkcji. Funkcje zaawansowane, takie jak In-Memory OLTP, natywnie kompilowane procedury czy pełna integracja z Microsoft Fabric, dostępne są w wyższych edycjach. Przed podjęciem decyzji zakupowej dotyczącej SQL Server 2025 lub nadchodzącego SQL Server 2026, warto dokładnie przeanalizować, które funkcjonalności są kluczowe dla Twojego środowiska. Właściwy wybór edycji i modelu licencjonowania może przynieść oszczędności sięgające 30-40% w perspektywie trzyletniej, szczególnie przy wdrożeniach hybrydowych łączących licencje on-premises z Azure Hybrid Benefit.

Sprawdź też

Potrzebujesz licencji? Microsoft SQL Server — sprawdź ofertę KluczeSoft.pl — legalne klucze, faktura VAT, dostawa e-mail.

<!-- INLINE-LINKS-V1 -->

Najczęściej zadawane pytania

Tak, `CHARINDEX` z konkretnym podciągiem literałowym jest szybszy niż `LIKE '%tekst%'` ponieważ nie wymaga interpretacji wzorca. Różnica jest szczególnie widoczna na dużych tabelach. Jednak `LIKE 'tekst%'` (wzorzec z prefiksem) może wykorzystać indeks, podczas gdy `CHARINDEX` zawsze wymaga pełnego skanowania indeksu lub tabeli.
Nie, `CHARINDEX` operuje wyłącznie na dokładnym dopasowaniu literałowym. Jeśli potrzebujesz wyrażeń regularnych, rozważ funkcje CLR (Common Language Runtime) lub Azure SQL Database z funkcjami zewnętrznymi. Alternatywnie, `PATINDEX` oferuje podstawowe dopasowywanie wzorców z symbolami wieloznacznymi.
Przekaż opcjonalny trzeci parametr `start_location` będący pozycją po pierwszym wystąpieniu. Dla drugiego wystąpienia: `CHARINDEX('x', kolumna, CHARINDEX('x', kolumna) + 1)`. Dla trzeciego zagnieżdż jeszcze głębiej. Alternatywnie, skorzystaj z techniki rekurencyjnego CTE.
Zachowanie `CHARINDEX` zależy od kolacji kolumny lub bazy danych. Aby wymusić porównywanie czułe na wielkość liter, użyj klauzuli `COLLATE` z kolacją `_CS_AS`, na przykład: `CHARINDEX('abc', kolumna COLLATE Latin1_General_CS_AS)`.
Tak, `CHARINDEX` w pełni obsługuje oba typy. Pamiętaj, że przy mieszaniu typów SQL Server wykonuje niejawną konwersję — `NVARCHAR` ma priorytet. W SQL Server 2025+ z kolacją `_UTF8`, `VARCHAR` może przechowywać znaki Unicode, co eliminuje potrzebę stosowania `NVARCHAR` w wielu scenariuszach.
Zawsze sprawdzaj wynik `CHARINDEX` przed użyciem w `SUBSTRING`. Stosuj konstrukcję `CASE WHEN CHARINDEX(...) > 0 THEN ... ELSE ... END`. Dla kodu produkcyjnego rozważ dodanie ograniczeń `CHECK` na poziomie tabeli, które wymuszą obecność oczekiwanych separatorów.
Lepiej unikać bezpośredniego `CHARINDEX` w `WHERE` na nieindeksowanych kolumnach, chyba że tabela jest mała. Rozważ persystowane kolumny obliczeniowe z indeksem, indeksy pełnotekstowe lub filtrowanie wstępne za pomocą `LIKE 'prefiks%'` aby zawęzić zbiór przed zastosowaniem `CHARINDEX`.
`CHARINDEX` w SQL Server i `INSTR` w Oracle pełnią tę samą rolę — wyszukiwanie podciągu. Główna różnica: `CHARINDEX(substring, string, start)` vs `INSTR(string, substring, start, occurrence)`. Oracle pozwala od razu wskazać n-te wystąpienie, SQL Server wymaga zagnieżdżenia lub dodatkowej logiki.
Nie do końca. `STRING_SPLIT` jest prostszy i szybszy dla prostego podziału, ale nie gwarantuje kolejności elementów (w wersjach przed SQL Server 2022) i nie pozwala na tak finezyjną kontrolę jak techniki oparte na `CHARINDEX`. W SQL Server 2022+ z opcją `enable_ordinal` problem kolejności został rozwiązany.
Bardzo dobrze. Microsoft zoptymalizował natywne procedury porównywania dla kolacji `_UTF8`, dzięki czemu `CHARINDEX` na `VARCHAR` z kolacją UTF-8 działa z porównywalną wydajnością co na tradycyjnych kolacjach jednobajtowych, przy jednoczesnej pełnej obsłudze znaków wielobajtowych.

Czy ten artykuł był pomocny?