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

问题描述

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

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

SELECT TABLE_NAME
FROM @R_128_4045@ION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_NAME LIKE '%seq'

但是我找不到如何一次从所有这些表中获取值的方法...

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

解决方法

您只能使用动态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;

由于没有可供测试的数据,因此如果无法使用,您需要使用“最好的朋友”进行调试。