从以特定字符串结尾的所有表中获取数据

Get data from all tables ending with a specific string

我正在寻找一个从许多以“_seq”结尾的不同表中获取 nextval 列的查询。

我知道如何获取表的名称...

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

但我找不到如何同时从所有这些表中获取值...

所有这些表都有相同的列。

您只能通过动态 SQL 实现此目的。当您使用 SQL Sevrer 2012 时,您需要使用“旧”FOR XML PATH 方法来创建“分隔”UNION ALL 查询。我还将架构名称和 table 添加到查询的数据集中,因为我认为这将是有价值的信息:

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;

由于没有数据可以测试,不行的话就需要你的“闺蜜”调试了。