я столкнулся с необходимостью очистки некоторых данных, и мне нужно найти некоторые конкретные указатели (т.е. uniqueidentifiers) в SQL Server °.
Я придумал хранимую процедуру, которая выполняет SELECT из каждого столбца uniqueidentifier в каждой таблице в текущей базе данных и возвращает набор результатов, если найдено guid.
Он использует представления INFORMATION_SCHEMA для поиска всех столбцов uniqueidentifier во всех базовых таблицах (в отличие от представлений). Для каждого столбца выдается выбор, возвращающий имя таблицы и столбец, где он был найден.
CREATE PROCEDURE dbo.FindGUID @searchValue uniqueidentifier AS
/*
Search all tables in the database for a guid
6/9/2009: Removed the IF EXISTS to double hit the database
*/
--DECLARE @searchValue uniqueidentifier
--SET @searchValue = '{2A6814B9-8261-452D-A144-13264433864E}'
DECLARE abc CURSOR FOR
SELECT
c.TABLE_NAME, c.COLUMN_NAME
FROM INFORMATION_SCHEMA.Columns c
INNER JOIN INFORMATION_SCHEMA.Tables t
ON c.TABLE_NAME = t.TABLE_NAME
AND t.TABLE_TYPE = 'BASE TABLE'
WHERE DATA_TYPE = 'uniqueidentifier'
DECLARE @tableName varchar(200)
DECLARE @columnName varchar(200)
DECLARE @szQuery varchar(8000)
OPEN ABC
FETCH NEXT FROM abc INTO @tableName, @columnName
WHILE (@@FETCH_STATUS = 0)
BEGIN
SET @szQuery =
'SELECT '''[email protected]+''' AS TheTable, '''[email protected]+''' AS TheColumn '+
'FROM '[email protected]+' '+
'WHERE '[email protected]+' = '''+CAST(@searchValue AS varchar(50))+''''
PRINT 'Searching '[email protected]+'.'[email protected]+'..'
PRINT @szQuery
EXEC (@szQuery)
FETCH NEXT FROM abc INTO @tableName, @columnName
END
CLOSE abc
DEALLOCATE abc
Мой вопрос:
Вопрос 1
Может ли кто-нибудь выяснить способ его изменения, чтобы выполнить поиск нескольких столбцов uniqueidentifier в той же таблице, что и OR, а не отдельные запросы
то есть.
SELECT ... FROM Prices WHERE BookGUID = '{...}'
SELECT ... FROM Prices WHERE AuthorGUID = '{...}'
SELECT ... FROM Prices WHERE PublisherGUID = '{...}'
SELECT ... FROM Prices WHERE StoreGUID = '{...}'
станет:
SELECT ...
FROM Prices
WHERE BookGUID = '{...}'
OR AuthorGUID = '{...}'
OR PublisherGUID = '{...}'
OR StoreGUID = '{...}'
Я попытался использовать курсор внутри курсора, но конфликт FETCH_STATUS.
Вопрос 2 Может ли кто-нибудь подумать о каком-либо лучшем способе сделать это? ‡
Сноска:
° SQL Server 2000
‡ При условии ограничения использования уникальных идентификаторов в реляционной базе данных.