Получение данных из всех таблиц, заканчивающихся определенной строкой

#sql #database #sql-server-2012 #information-schema

#sql #База данных #sql-server-2012 #информация-схема

Вопрос:

Я ищу запрос, который получает столбец nextval из множества разных таблиц, заканчивающихся на «_seq».

Я знаю, как получить имена таблиц…

 SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_NAME LIKE '%seq'
  

Но я не смог найти, как получить значения из всех этих таблиц сразу…

Все эти таблицы имеют один и тот же столбец.

Комментарии:

1. взгляните на information_schema.columns

Ответ №1:

Вы можете достичь этого только с помощью dynamic SQL. Поскольку вы используете SQL Sevrer 2012, вам нужно будет использовать «старый» FOR XML PATH метод для создания запроса с разделителями UNION ALL . Я также добавил имя схемы и таблицы в набор данных запроса, поскольку предполагаю, что это будет ценная информация:

 DECLARE @SQL nvarchar(MAX),
        @CRLF nchar(2) = NCHAR(13)   NCHAR(10);

SET @SQL = STUFF((SELECT N'UNION ALL'   @CRLF  
                         N'SELECT N'   QUOTENAME(s.[name],'''')   N' AS SchemaName,'   @CRLF   
                         N'       N'   QUOTENAME(t.[name],'''')   N' AS TableName,'   @CRLF   
                         N'       NextVal'   @CRLF  
                         N'FROM '   QUOTENAME(s.[name])   N'.'   QUOTENAME(t.[name])
                  FROM sys.schemas s
                       JOIN sys.tables t ON s.schema_id = t.schema_id
                       JOIN sys.columns c ON t.object_id = c.object_id
                  WHERE t.[name] LIKE '%[_]seq'
                    AND c.[name] = N'NextVal'
                  FOR XML PATH(''),TYPE).value('.','nvarchar(MAX)'),1,11,N'')   N';'

--PRINT @SQL; --Your best friend.

EXEC sys.sp_executesql @SQL;
  

Поскольку данных для тестирования нет, вам нужно будет использовать вашего «лучшего друга» для отладки, если это не сработает.