É claro que omitir o comprimento de um varchar é uma coisa ruim . Infelizmente agora estou trabalhando com uma base de código onde isso aconteceu. Extensivamente. Eu gostaria de corrigir isso. O primeiro passo será encontrar as ocorrências. É aqui que preciso de ajuda.
Pesquisas em vários mecanismos da web usando todos os sinônimos que consigo imaginar não retornam nenhuma resposta oficial. estou pedindo
- casos de teste adicionais que perdi
- uma maneira abrangente e canônica de encontrar declarações sem extensão
Qualquer tecnologia normalmente disponível em um ambiente de desenvolvimento Windows (SSMS, Powershell, .Net etc.) é boa. Respostas que empregassem mais tecnologias de nicho seriam interessantes para a comunidade em geral, mas nem tanto para mim, pessoalmente.
Testes
Como os quatro tipos de dados em questão - char, nchar, varchar e nvarchar - terminam todos com os caracteres CHAR, utilizo isso sozinho nos testes abaixo. Isso evita o inchaço da lista e simplifica a adição de mais testes. Será fácil copiar, colar e substituir, caso seja necessário.
-- These are all legal; the regex must not return these
char(9)
char (9) -- with a space
char (9) -- with a tab
char (9) -- tab space tab space
char(max)
char
(9) -- a new line between type and length
character(9)
CAST(999 AS character(9))
char varying(9)
character varying(9)
CAST(999 AS char varying(9))
CAST(999 AS character varying(9))
-- These also are legal; ugly, but legal
[char](9)
[char] (9) -- with a space
[char] (9) -- with a tab
[char] (9) -- tab space tab space
[char](max)
[char]
(9) -- a new line between type and length
-- The type can also be delimited by double-quote
"char"(9)
-- All the tests using square brackets should be duplicated with other delimiters.
[character](9)
CAST(999 AS [character](9))
-- SQL Server 2022 throws an error for [character varying]
-- Msg 243, Level 16, State 1, Line 15
-- Type character varying is not a defined system type.
-- These are business terms which the regex should not return
characteristic
charge
chart
-- These are valid SQL but missing the length. These are what the search should return
char;
char ; -- a space
char ; -- a tab
char,
char ,
char = 'lorem'
cast(9 as char)
convert(char, 9)
[char];
[char] ; -- a space
[char] ; -- a tab
[char],
[char] ,
[char] = 'lorem'
cast(9 as [char])
convert([char], 9)
character
CAST(999 AS character)
char varying
character varying
CAST(999 AS char varying)
CAST(999 AS character varying)