#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;
Поскольку данных для тестирования нет, вам нужно будет использовать вашего «лучшего друга» для отладки, если это не сработает.