Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Uniqueidentifier вхождения  [new]
Gric_Art
Member

Откуда:
Сообщений: 48
Всем привет.

Подскажите, как можно узнать где используется конкретный id в рамках всей базы?

Т.е. допустим у меня есть таблица Table1 и ещё 100 таблиц.
В Table1 есть запись с uid каким-то. Как мне узнать где он используется ещё, не зная структуры базы.

Т.е. мне необходим запрос SELECT Колонки_с_этим_ид, Название_таблицы_с_колонкой FROM База_данных WHERE uid = мой_ид

Спасибо заранее. Очень поможете.
19 окт 16, 17:39    [19801180]     Ответить | Цитировать Сообщить модератору
 Re: Uniqueidentifier вхождения  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31779
Gric_Art
Подскажите, как можно узнать где используется конкретный id в рамках всей базы?
В цикле по таблицам выбрать записи, которые содержат значение ИД, положить их в временную таблицу.
Потом сделать из неё селект.
19 окт 16, 17:41    [19801194]     Ответить | Цитировать Сообщить модератору
 Re: Uniqueidentifier вхождения  [new]
iljy
Member

Откуда:
Сообщений: 8711
Gric_Art,

собирайте динамический запрос на основе sys.columns, чтобы он выдал имена таблиц, содержащих этот идентификатор. Дальше его в exec.
19 окт 16, 17:41    [19801199]     Ответить | Цитировать Сообщить модератору
 Re: Uniqueidentifier вхождения  [new]
Lepsik
Member

Откуда: glubinka
Сообщений: 4256
-- convert row of data to string for reporting
CREATE procedure sp_makerow @tbl_name sysname, @col_name sysname, @IntVariable int, @result nvarchar(max) out
AS
BEGIN
     SET NOCOUNT ON
     DECLARE @SQLString nvarchar(max) = '';
     select @SQLString =  @SQLString + ' + '' | '' + COALESCE(CAST(' + column_name + ' AS nvarchar(64)), ''NULL'')' from information_schema.columns  where table_name = @tbl_name
     SET @SQLString = 'SELECT TOP 1 @rawout = ' + @SQLString + ' FROM ' + @tbl_name + ' where ' + @col_name + ' = @value'
     DECLARE @ParmDefinition nvarchar(64)= N'@value int, @rawout nvarchar(max) OUTPUT';
     EXECUTE sp_executesql @SQLString, @ParmDefinition, @value = @IntVariable, @rawout = @result OUTPUT
END

-- search number in all tables
CREATE procedure sp_searchint @IntVariable int
AS
BEGIN
     SET NOCOUNT ON
     DECLARE @tbl table(table_name sysname, column_name sysname, cnt int, datatext nvarchar(max))
     DECLARE @value sysname, @table_name sysname, @column_name sysname
     DECLARE cFKey CURSOR LOCAL FOR select table_name, column_name from information_schema.columns  where data_type in ('int', 'numeric')
     OPEN cFKey
     FETCH NEXT FROM cFKey INTO @table_name, @column_name
     WHILE @@FETCH_STATUS = 0
         BEGIN
            DECLARE @cnt int = 0;
            DECLARE @ParmDefinition nvarchar(64)= N'@value int, @cntout int OUTPUT';
            DECLARE @SQLString nvarchar(500) = 'select @cntout =count(*) from ' + @table_name + ' where ' + @column_name + ' = @value'
            EXECUTE sp_executesql @SQLString, @ParmDefinition, @value = @IntVariable, @cntout = @cnt OUTPUT
            IF @cnt > 0 
            BEGIN
                declare @result nvarchar(max);
                exec sp_makerow @table_name, @column_name, @IntVariable, @result out        
                INSERT INTO @tbl (table_name, column_name , cnt, datatext) values (@table_name, @column_name, @cnt, @result)
            END
	    FETCH NEXT FROM cFKey INTO @table_name, @column_name
        END
    Close cFKey
    DeAllocate cFKey
    select * FROM @tbl
END
GO


exec sp_searchint 25
20 окт 16, 07:52    [19802533]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить