声明 table 名称以在不同的 "From" 语句中使用
Declare table name to use in different "From"-statements
我不想从一组 table 对中创建两个不同的临时 tables,它们在至少两个不同的数据库中具有相同的 table 名称。总而言之,我有 4 个不同的 table 对,这就是我尝试为其声明变量的原因,所以我只需要更改程序顶部的 table 名称。
当我尝试声明一个变量以在 "From" 语句中使用时,但代码无法运行。我已经阅读了一些关于动态规划的内容,但并不真正理解如何在这种情况下使用它。
DECLARE @table char(20);
SET @table = 'Table_1';
SELECT a.*
into #temp1
FROM [DB_1].[Schema].@table a
select a.*
into #temp2
FROM [DB_2].[Schema].@table a
提前致谢,
干杯
您可以为此目的使用动态 SQL:
DECLARE @table char(20);
SET @table = 'Table_1';
SET @SQL = 'SELECT a.* into #temp1 FROM [DB_1].[Schema].' + @table + 'a'
SET @SQL2 = 'select a.* into #temp2 FROM [DB_2].[Schema].' + @table + 'a'
EXEC(@SQL);
EXEC(@SQL2);
我刚刚使用 Adventure works 示例数据库作为示例数据库,请使用此 sql 脚本它会达到您的预期结果
IF OBJECT_ID('tempdb..#TableList')IS NOT NULL
DROP TABLE #TableList
CREATE TABLE #TableList(
Id INT IDENTITY,
TABLE_NAME VARCHAR(100),
TABLE_CATALOG VARCHAR(100),
TABLE_SCHEMA VARCHAR(100),
TempTableNAme VARCHAR(100)
)
INSERT INTO #TableList
(TABLE_NAME,
TABLE_CATALOG,
TABLE_SCHEMA,
TempTableNAme
)
SELECT TABLE_NAME ,
TABLE_CATALOG ,
TABLE_SCHEMA,
'#Temp'+CAST(ROW_NUMBER()OVER(ORDER BY TABLE_NAME) AS VARCHAR(10)) AS TempTableNAme
FROM INFORMATION_SCHEMA.TABLES
ORDER BY 1
DECLARE @MaxID INT,
@MinID INT,
@Sql nvarchar(max),
@GetTABLE_NAME VARCHAR(100),
@GetTABLE_CATALOG VARCHAR(100),
@GetTABLE_SCHEMA VARCHAR(100),
@GetTempTableNAme VARCHAR(100)
SELECT @MaxID=Max(Id),@MinID=Min(Id)
FROM #TableList
WHILE @MinID<=@MaxID
BEGIN
SELECT @GetTABLE_NAME= TABLE_NAME ,
@GetTABLE_CATALOG =TABLE_CATALOG,
@GetTABLE_SCHEMA=TABLE_SCHEMA,
@GetTempTableNAme=TempTableNAme
FROM #TableList WHERE Id = @MinID
SET @Sql='SELECT * INTO '+@GetTempTableNAme+'_'+@GetTABLE_NAME+' FROM '+ QUOTENAME(@GetTABLE_CATALOG) +'.'+ QUOTENAME(@GetTABLE_SCHEMA)+'.'+ QUOTENAME(@GetTABLE_NAME)
--EXEC (@Sql)
PRINT @Sql
SET @MinID=@MinID+1
END
我不想从一组 table 对中创建两个不同的临时 tables,它们在至少两个不同的数据库中具有相同的 table 名称。总而言之,我有 4 个不同的 table 对,这就是我尝试为其声明变量的原因,所以我只需要更改程序顶部的 table 名称。
当我尝试声明一个变量以在 "From" 语句中使用时,但代码无法运行。我已经阅读了一些关于动态规划的内容,但并不真正理解如何在这种情况下使用它。
DECLARE @table char(20);
SET @table = 'Table_1';
SELECT a.*
into #temp1
FROM [DB_1].[Schema].@table a
select a.*
into #temp2
FROM [DB_2].[Schema].@table a
提前致谢,
干杯
您可以为此目的使用动态 SQL:
DECLARE @table char(20);
SET @table = 'Table_1';
SET @SQL = 'SELECT a.* into #temp1 FROM [DB_1].[Schema].' + @table + 'a'
SET @SQL2 = 'select a.* into #temp2 FROM [DB_2].[Schema].' + @table + 'a'
EXEC(@SQL);
EXEC(@SQL2);
我刚刚使用 Adventure works 示例数据库作为示例数据库,请使用此 sql 脚本它会达到您的预期结果
IF OBJECT_ID('tempdb..#TableList')IS NOT NULL
DROP TABLE #TableList
CREATE TABLE #TableList(
Id INT IDENTITY,
TABLE_NAME VARCHAR(100),
TABLE_CATALOG VARCHAR(100),
TABLE_SCHEMA VARCHAR(100),
TempTableNAme VARCHAR(100)
)
INSERT INTO #TableList
(TABLE_NAME,
TABLE_CATALOG,
TABLE_SCHEMA,
TempTableNAme
)
SELECT TABLE_NAME ,
TABLE_CATALOG ,
TABLE_SCHEMA,
'#Temp'+CAST(ROW_NUMBER()OVER(ORDER BY TABLE_NAME) AS VARCHAR(10)) AS TempTableNAme
FROM INFORMATION_SCHEMA.TABLES
ORDER BY 1
DECLARE @MaxID INT,
@MinID INT,
@Sql nvarchar(max),
@GetTABLE_NAME VARCHAR(100),
@GetTABLE_CATALOG VARCHAR(100),
@GetTABLE_SCHEMA VARCHAR(100),
@GetTempTableNAme VARCHAR(100)
SELECT @MaxID=Max(Id),@MinID=Min(Id)
FROM #TableList
WHILE @MinID<=@MaxID
BEGIN
SELECT @GetTABLE_NAME= TABLE_NAME ,
@GetTABLE_CATALOG =TABLE_CATALOG,
@GetTABLE_SCHEMA=TABLE_SCHEMA,
@GetTempTableNAme=TempTableNAme
FROM #TableList WHERE Id = @MinID
SET @Sql='SELECT * INTO '+@GetTempTableNAme+'_'+@GetTABLE_NAME+' FROM '+ QUOTENAME(@GetTABLE_CATALOG) +'.'+ QUOTENAME(@GetTABLE_SCHEMA)+'.'+ QUOTENAME(@GetTABLE_NAME)
--EXEC (@Sql)
PRINT @Sql
SET @MinID=@MinID+1
END