从以特定字符串结尾的所有表中获取数据
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;
由于没有数据可以测试,不行的话就需要你的“闺蜜”调试了。
我正在寻找一个从许多以“_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;
由于没有数据可以测试,不行的话就需要你的“闺蜜”调试了。