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

Откуда:
Сообщений: 65
Здравствуйте. Вопрос в следующем - имеется список таблиц, в каждой из этих таблиц имеется одноимённое поле. Можно ли как-то перебрать (в цикле или нет) все эти поля на наличие определённого номера?
Т.е. нужен, например, ProdID = 5, в результате получить все значения (ValueA, ValueB)

К сообщению приложен файл. Размер - 12Kb
12 ноя 19, 22:27    [22014862]     Ответить | Цитировать Сообщить модератору
 Re: Перебрать таблицы на наличие определённого номера в полях  [new]
Remind
Member

Откуда: UK
Сообщений: 523
dynamic sql
12 ноя 19, 23:37    [22014883]     Ответить | Цитировать Сообщить модератору
 Re: Перебрать таблицы на наличие определённого номера в полях  [new]
Earl11
Member

Откуда:
Сообщений: 65
Понятно, но как?
13 ноя 19, 00:24    [22014904]     Ответить | Цитировать Сообщить модератору
 Re: Перебрать таблицы на наличие определённого номера в полях  [new]
Lepsik
Member

Откуда: glubinka
Сообщений: 4256
CREATE procedure [dbo].[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 988
13 ноя 19, 00:25    [22014905]     Ответить | Цитировать Сообщить модератору
 Re: Перебрать таблицы на наличие определённого номера в полях  [new]
Earl11
Member

Откуда:
Сообщений: 65
А ничего подобного не получится? Если сджоинить все таблицы, а выводить поля, в которых есть заданный ProdID
SELECT  M.ProdID
	,T1.ValueA   ---Вывести только 
    ,T2.ValueB	---  эти поля
	
  FROM Table_main M
  LEFT JOIN [Table1] T1 ON M.ProdID = T1.ProdID
  LEFT JOIN [Table2] T2 ON M.ProdID = T2.ProdID
LEFT JOIN [Table3] T3 ON M.ProdID = T3.ProdID
13 ноя 19, 00:55    [22014914]     Ответить | Цитировать Сообщить модератору
 Re: Перебрать таблицы на наличие определённого номера в полях  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31331
Earl11
А ничего подобного не получится? Если сджоинить все таблицы, а выводить поля, в которых есть заданный ProdID
Разумеется, если таблицы и поля известны (если не надо писать процедуру "для любых таблиц"), то намного лучше написать простой запрос.
13 ноя 19, 08:46    [22014977]     Ответить | Цитировать Сообщить модератору
 Re: Перебрать таблицы на наличие определённого номера в полях  [new]
Earl11
Member

Откуда:
Сообщений: 65
alexeyvg,
Таблицы известны. Т.е. можно и через курсор?
13 ноя 19, 22:53    [22015755]     Ответить | Цитировать Сообщить модератору
 Re: Перебрать таблицы на наличие определённого номера в полях  [new]
Earl11
Member

Откуда:
Сообщений: 65
Просто как в таком случае (в случае курсора) убрать ненужные таблицы (в которых нет нужного ProdId)
Может глупые вопросы задаю, не понимаю
13 ноя 19, 23:33    [22015766]     Ответить | Цитировать Сообщить модератору
 Re: Перебрать таблицы на наличие определённого номера в полях  [new]
Earl11
Member

Откуда:
Сообщений: 65
Вопрос решился

Спасибо Lepsik за часть кода, не заметил

declare @a nvarchar(max), @b nvarchar(max), @c int = 0, @in nvarchar(max) =''
declare curs cursor for
SELECT table_name FROM INFORMATION_SCHEMA.COLUMNS
WHERE column_name = 'ProdId'
set @b = ''
open curs 
fetch next from curs
into @a
declare @Par nvarchar(max)= '@co int OUTPUT'
while @@FETCH_STATUS = 0
begin
	
	set @b  = '  Select @co =count(*) from ' +@a+ ' WHERE ProdId= 1
' 
exec sp_executesql @b, @Par, @co= @c OUTPUT

if @c>0 begin
set @in = @in+@a+' '

end
	
	fetch next from curs
	into @a
end 

close curs
deallocate curs

print @in
14 ноя 19, 01:23    [22015797]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить