Найдите таблицу с GUID в качестве имени - PullRequest
1 голос
/ 29 апреля 2019

У меня есть таблицы с именами GUID, которые генерируются.

Например:

У меня есть таблицы с именами:

FD962987-AA3E-441C-B608-2392B68A5287

508482AF-EFCF-41C1-B083-D51BF37C3590

А также наличие некоторых других таблиц в базе данных.

Я просто хочу найти таблицу с именем GUID.

Моя попытка:

SELECT name 
FROM sys.tables 
WHERE LEN(tables.name) = 36 

Вышеприведенный запрос работает нормально, но когда у меня появляются другие таблицы (которые не являются именами GUID) с тем же леном имени таблицы, которое отображается.

Ответы [ 2 ]

4 голосов
/ 29 апреля 2019

Попробуйте что-то вроде:

SELECT 
    name 
FROM 
    sys.tables 
WHERE 
    LEN(tables.name) = 36 
    AND (tables.name LIKE '%-%-%-%-%') --OR tables.name LIKE '%-____-____-____-%') 
2 голосов
/ 29 апреля 2019

Если ваша версия MS SQL Server поддерживает его (2012+), вы можете использовать TRY_CONVERT для этого.
TRY_CONVERT возвращает NULL в случае сбоя преобразования.

SELECT t.name 
FROM sys.tables t 
WHERE LEN(t.name) = 36 
  AND TRY_CONVERT(UNIQUEIDENTIFIER, t.name) IS NOT NULL;

Или вы можете использовать LIKE с диапазонами символов. Но это скорее метод анти-гольфкода.
Поскольку UNIQUEIDENTIFIER имеет очень специфический формат, в котором используются только символы ABCDEF0123456789 между 4 тире.

SELECT t.name 
FROM sys.tables t 
WHERE t.name like '[A-F0-9][A-F0-9][A-F0-9][A-F0-9][A-F0-9][A-F0-9][A-F0-9][A-F0-9]-[A-F0-9][A-F0-9][A-F0-9][A-F0-9]-[A-F0-9][A-F0-9][A-F0-9][A-F0-9]-[A-F0-9][A-F0-9][A-F0-9][A-F0-9]-[A-F0-9][A-F0-9][A-F0-9][A-F0-9][A-F0-9][A-F0-9][A-F0-9][A-F0-9][A-F0-9][A-F0-9][A-F0-9][A-F0-9]'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...