PATINDEX (Transact-SQL)

Aplica-se a:SQL ServerBase de Dados SQL do AzureAzure SQL Managed InstanceAzure Synapse AnalyticsEndpoint de análise SQL no Microsoft FabricArmazém no Microsoft FabricBase de dados SQL no Microsoft Fabric

Retorna a posição inicial da primeira ocorrência de um padrão em uma expressão especificada, ou zero se o padrão não for encontrado, em todos os tipos de dados de texto e caractere válidos.

Transact-SQL convenções de sintaxe

Syntax

PATINDEX ( '%pattern%' , expression )

Arguments

pattern

Uma expressão de caractere que contém a sequência a ser encontrada. Podem ser usados caracteres coringa; no entanto, o % carácter deve vir antes e seguir o padrão (exceto quando procuras o primeiro ou último caractere). O padrão é uma expressão da categoria de tipo de dados da cadeia de caracteres. o padrão está limitado a 8.000 caracteres.

Note

Embora as expressões regulares tradicionais não tenham suporte nativo no SQL Server 2022 (16.x) e em versões anteriores, a correspondência de padrões complexos semelhante pode ser obtida usando várias expressões curinga. Consulte a documentação dos operadores de strings para mais detalhes sobre a sintaxe dos curingas. Para informações sobre funções de expressões regulares no SQL Server 2025 (17.x), veja Funções de expressões regulares.

expression

Uma expressão, tipicamente uma coluna que é pesquisada pelo padrão especificado. a expressão pertence à categoria de tipos de dados de cadeia de caracteres.

Tipos de devolução

bigint se a expressão for dos tipos de dados varchar(max) ou nvarchar(max ); caso contrário, int.

Remarks

Se o padrão for NULL, PATINDEX devolve NULL.

Se expression for NULL, PATINDEX retorna um erro.

A posição inicial para PATINDEX é 1.

PATINDEX realiza comparações com base no agrupamento da entrada. Para executar uma comparação em um agrupamento especificado, você pode usar COLLATE para aplicar um agrupamento explícito à entrada.

Caracteres suplementares (pares substitutos)

Quando usas colações com caracteres suplementares (SC), o valor de retorno conta quaisquer pares substitutos UTF-16 no parâmetro de expressão como um único carácter. Para obter mais informações, consulte Classificação e suporte a Unicode.

0x0000 (char(0)) é um caractere indefinido em agrupamentos do Windows e não pode ser incluído no PATINDEX.

Examples

A. Exemplo básico de PATINDEX

O exemplo a seguir verifica uma cadeia de caracteres curta (interesting data) para o local inicial dos caracteres ter.

SELECT PATINDEX('%ter%', 'interesting data') AS position;

Aqui está o conjunto de resultados.

position
--------
3

B. Use um padrão com PATINDEX

O exemplo seguinte encontra a posição em que o padrão ensure começa numa linha específica da DocumentSummary coluna na Document tabela da base de dados AdventureWorks2025.

SELECT PATINDEX('%ensure%', DocumentSummary) AS position
FROM Production.Document
WHERE DocumentNode = 0x7B40;
GO

Aqui está o conjunto de resultados.

position
--------
64

Se você não restringir as linhas a serem pesquisadas usando uma WHERE cláusula, a consulta retornará todas as linhas da tabela e relatará valores diferentes de zero para as linhas nas quais o padrão foi encontrado e zero para todas as linhas nas quais o padrão não foi encontrado.

C. Usar caracteres curinga com PATINDEX

O exemplo a seguir usa curingas % e _ para localizar a posição na qual o padrão 'en', seguido por qualquer caractere e 'ure' começa na cadeia de caracteres especificada (índice começa em 1):

SELECT PATINDEX('%en_ure%', 'Please ensure the door is locked!') AS position;

Aqui está o conjunto de resultados.

position
--------
8

PATINDEX funciona como LIKE, para que você possa usar qualquer um dos curingas. Não é necessário incluir o padrão entre percentagens. PATINDEX('a%', 'abc') retorna 1 e PATINDEX('%a', 'cba') retorna 3.

Ao contrário LIKEde , PATINDEX retorna uma posição, semelhante ao que CHARINDEX faz.

D. Use expressões curinga complexas com PATINDEX

O exemplo seguinte usa o [^]operador string para encontrar a posição de um carácter que não é um número, letra ou espaço.

SELECT PATINDEX('%[^ 0-9A-Za-z]%', 'Please ensure the door is locked!') AS position;

Aqui está o conjunto de resultados.

position
--------
33

E. Utilização COLLATE com PATINDEX

O exemplo a seguir usa a COLLATE função para especificar explicitamente o agrupamento da expressão pesquisada.

USE tempdb;
GO

SELECT PATINDEX('%ein%', 'Das ist ein Test' COLLATE Latin1_General_BIN);
GO

Aqui está o conjunto de resultados.

position
--------
9

F. Usar uma variável para especificar o padrão

O exemplo seguinte usa uma variável para passar um valor ao parâmetro do padrão . Este exemplo utiliza a base de dados AdventureWorks2025.

DECLARE @MyValue AS VARCHAR (10) = 'safety';

SELECT PATINDEX('%' + @MyValue + '%', DocumentSummary) AS position
FROM Production.Document
WHERE DocumentNode = 0x7B40;

Aqui está o conjunto de resultados.

position
--------
22