有没有办法在SQL中动态设置表名?
DROP TABLE IF EXISTS #temptable
CREATE TABLE #temptable ([Rownum] INT IDENTITY(1, 1), [DatabaseName] INT, [CustomerName] NVARCHAR(50) )
INSERT INTO #temptable ([DatabaseName], [CustomerName])
VALUES
( 361, 'Adam' ),
( 362, 'Bella' ),
( 363, 'Charlie' )
所以输出是
SELECT * FROM C361.dbo.CustomerInfo WHERE CustomerName = 'Adam'
SELECT * FROM C362.dbo.CustomerInfo WHERE CustomerName = 'Bella'
SELECT * FROM C363.dbo.CustomerInfo WHERE CustomerName = 'Charlie'
您可以使用
STRING_AGG
创建动态 SQL 字符串。
DECLARE @sql nvarchar(max);
SELECT @sql =
STRING_AGG(CONVERT(nvarchar(max), CONCAT('
SELECT *
FROM ', QUOTENAME(CONCAT('C', tt.DatabaseName)), '.dbo.CustomerInfo
WHERE CustomerName = ', QUOTENAME(tt.CustomerName, '''')
)), '')
FROM #temptable tt;
PRINT @sql; -- your friend
EXEC sp_executesql @sql;
请注意使用
QUOTENAME
来正确转义名称和值。