sql - 将多个表插入到一张表中

标签 sql sql-server t-sql sql-server-2008-r2

我是一名新的程序员分析师。我正在学习 SQL,我正在尝试将多个表(所有表都具有相同字段)的数据插入到一个大型历史表中。是否有捷径可寻?到目前为止我已经有了这个,但我知道这是错误的:

Create Procedure InsertTables  
@ExistingTableName nvarchar(50) 
AS

   insert into EMF_Archive    
select      
em_Employee_ID,
em_Payroll_Unit,
em_Name,
em_Payroll_Unit_2,
em_Last_Name,
em_First_Name,
em_Middle_Initial,
em_Social_Security_No,
em_Payroll_Group,
em_Employee_Status,
em_Hire_Date,
em_Rehire_Date,
em_Adjusted_Hire_Date,
em_Birth_Date,
em_Termination_Date,
em_Organization,
em_Title,
em_Work_Comp,
em_Annual_Pay,
em_Salary_Rate,
em_Tax_Group,
em_Seniority_Date,
em_service_Years,
em_Service_Months,
em_Grade,
em_Variable_3,
em_Variable_4,
em_Standard_Hours,
em_Variable_10,
em_Variable_11,
em_Shift
from @ExistingTableName  

GO

EXEC InsertTables 'emf_payPeriod1'

我想像这样执行几次:

EXEC InsertTables 'emf_payPeriod1'
EXEC InsertTables 'emf_payPeriod2'
EXEC InsertTables 'emf_payPeriod3'
  etc

等等......

最佳答案

您无法像您尝试的那样传递表名称,您将需要使用动态 sql 来执行此操作,如下所示...

Create Procedure InsertTables  
@ExistingTableName nvarchar(128) 
AS
BEGIN
  SET NOCOUNT ON;

  DECLARE @Sql NVARCHAR(MAX);

SET @Sql = N' INSERT INTO EMF_Archive    
            select      
            em_Employee_ID,
            em_Payroll_Unit,
            em_Name,
            em_Payroll_Unit_2,
            em_Last_Name,
            em_First_Name,
            em_Middle_Initial,
            em_Social_Security_No,
            em_Payroll_Group,
            em_Employee_Status,
            em_Hire_Date,
            em_Rehire_Date,
            em_Adjusted_Hire_Date,
            em_Birth_Date,
            em_Termination_Date,
            em_Organization,
            em_Title,
            em_Work_Comp,
            em_Annual_Pay,
            em_Salary_Rate,
            em_Tax_Group,
            em_Seniority_Date,
            em_service_Years,
            em_Service_Months,
            em_Grade,
            em_Variable_3,
            em_Variable_4,
            em_Standard_Hours,
            em_Variable_10,
            em_Variable_11,
            em_Shift
            from ' + QUOTENAME(@ExistingTableName)

   EXECUTE sp_executesql  @Sql
END

GO

执行程序

要进一步对所有表执行此过程,您可以执行以下查询

--Make sure the following query is pulling all the required tables
SELECT name INTO #Tables
from sys.tables
WHERE name like 'emf_payPeriod%'

-- Now use that temp table to pass table names to your procedure
DECLARE @TableName NVARCHAR(128);

WHILE EXISTS (SELECT 1 FROM #Tables)
BEGIN
  SELECT TOP 1 @TableName = name FROM #Tables

  EXECUTE InsertTables @TableName

  DELETE FROM #Tables WHERE name = @TableName
END

关于sql - 将多个表插入到一张表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23666001/

相关文章:

sql - 将文本 blob 从 Firebird 转换为 nvarchar 到 SQL Server

sql-server - T-SQL:包含最近日期的日期列表

SQL Server 2014 替换为正则表达式

xml - 属性 "y"的 T-SQL XQuery 值,其中属性 "x"已知

sql - 如何编写可以返回0行作为case语句一部分的T-SQL查询

mysql - 将两个计数查询合并为一个

sql - 在 Postgresql 中使用重复索引有什么坏处吗?

SQL 服务器 : copy row and Insert into to the same table but with a different ID

MySQL 错误 1215 (HY000) : Cannot add foreign key constraint

sql - 如果数据库总是进入 RECOVERY,这意味着什么?