Создайте запрос ms sql для получения данных из таблиц, принадлежащих разным схемам. - PullRequest
0 голосов
/ 05 февраля 2020

У меня есть таблица с именем 'tbl_user', и эта таблица существует во многих схемах, например:

  • schema1.tbl_user
  • schema2.tbl_user

и так далее. Я хотел бы объединить все данные в этих таблицах и получить один результат, и я не могу использовать какой-либо язык программирования, потому что среда, в которой мне нужно работать, не позволяет этого. Есть ли способ выполнить sh на sql server 2008 с помощью хранимых процедур?

Редактировать: Существует более тысячи схем, и схемы могут быть добавлены и удалены со временем.

Ответы [ 2 ]

2 голосов
/ 05 февраля 2020

используя курсор, создайте динамический запрос c и выполните его при завершении.

Вы можете добавить дополнительный фильтр, если хотите отфильтровать схему.

DECLARE @NAME VARCHAR(100)
DECLARE @SQL NVARCHAR(300)
DECLARE @TABLE_NAME NVARCHAR(300)='userMaster'

DECLARE CUR CURSOR FOR
  SELECT S.name
  from sys.schemas s
    inner join sys.sysusers u
        on u.uid = s.principal_id
order by s.name

OPEN CUR

FETCH NEXT FROM CUR INTO @NAME

WHILE @@FETCH_STATUS = 0
  BEGIN
         IF (EXISTS (SELECT * 
                         FROM INFORMATION_SCHEMA.TABLES 
                         WHERE TABLE_SCHEMA =@NAME 
                         AND  TABLE_NAME =@TABLE_NAME))
        BEGIN
        IF(LEN(@SQL)>0) 
        begin 
         SET @SQL =@SQL+' UNION ALL SELECT * FROM ['+@NAME+'].['+@TABLE_NAME+']'    
        end
        ELSE
        begin
        SET @SQL ='SELECT * FROM ['+@NAME+'].['+@TABLE_NAME+']'
        end
        --PRINT @SQL
        END


      FETCH NEXT FROM CUR INTO @NAME
  END

CLOSE CUR

DEALLOCATE CUR 
PRINT @SQL
exec(@SQL)
0 голосов
/ 05 февраля 2020

Попробуйте и помните, что таблицы должны иметь одинаковую структуру.

SELECT *
FROM   schema1.tbl_user
UNION
SELECT *
FROM   schema2.tbl_user

И для большого количества схем вы можете использовать следующую хранимую процедуру. Это создаст динамический запрос UNION, и вы можете добавить условия для фильтрации имен схемы и таблицы.

DECLARE @table_name NVARCHAR(100)
DECLARE @schema_name NVARCHAR(100)
DECLARE @gettable CURSOR
DECLARE @query NVARCHAR(100)
SET @query=''
SET @gettable = CURSOR FOR
SELECT name,
       schema_name(schema_id)
FROM   sys.tables

OPEN @gettable
FETCH NEXT
FROM @gettable INTO @table_name, @schema_name
WHILE @@FETCH_STATUS = 0
BEGIN
    SET @query = @query + 'SELECT * FROM ' + @schema_name + '.'+ @table_name + ' UNION ';
    FETCH NEXT
    FROM @gettable INTO @table_name, @schema_name
END
CLOSE @gettable
DEALLOCATE @gettable
print @query;
...