问题描述
我正在寻找一个从许多以“ _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;
由于没有可供测试的数据,因此如果无法使用,您需要使用“最好的朋友”进行调试。