【问题标题】:stored procedure to compare two tables and insert data into new table in sql server存储过程比较两个表并将数据插入到sql server中的新表中
【发布时间】:2015-08-25 19:26:44
【问题描述】:

我是存储过程的新手,如果有人可以帮助我,我有一个请求。

我有两个相同架构的表 temp_20130426temp_20130427 具有以下列:

PID SID Relationship    LName   FName   Col1    PII LastUpdated

LastUpdated 栏目每天都在变化,

我的要求是写一个 SP 来比较除LastUpdate 之外的每一列上的两个表数据,并将数据写入新的able

PID SID Relationship    LName   FName   Col1    PII LastUpdated Delete

Delete 列是第二天没有记录时必须标记的内容

感谢您的帮助!!

【问题讨论】:

  • 删除列是在下一天不存在记录时必须标记的内容
  • 你能在 SQL 查询中写这个吗?
  • 我在两个表之间使用了'except'来获得差异,我可以得到结果..但是如果第二天该行不存在,我将无法写入删除标志。像这样,我有一个月的数据和 30 个表,表末尾有数据更改。
  • 只有数据(LastUpdated 除外)发生变化时,记录才会写入新表吗?
  • 是的,它应该从最新日期开始写入数据,

标签: sql sql-server tsql stored-procedures


【解决方案1】:

我认为这就是你需要的 -

declare @temp_20130427 table (
                           PID INT
                          ,SID INT
                          ,Relationship char(1)
                          ,Lname varchar(50)
                          ,Fname varchar(50)
                          ,Col1 varchar(50)
                          ,PII varchar(50)
                          ,LastUpdated datetime
                            )
insert into @temp_20130427 values (1,1,'P','Khan','Shahrukh','Actor','Famous',GETDATE())
                        ,(2,2,'P','Khan','Salman','Actor','Famous',GETDATE())
                        ,(3,3,'P','Khan','Saif Ali','Actor','Famous',GETDATE())

select * from @temp_20130427


declare @temp_20130426 table (
                           PID INT
                          ,SID INT
                          ,Relationship char(1)
                          ,Lname varchar(50)
                          ,Fname varchar(50)
                          ,Col1 varchar(50)
                          ,PII varchar(50)
                          ,LastUpdated datetime
                          ,[Delete] bit
                            )
insert into @temp_20130426 values (1,1,'P','Khan','Shahrukh','Actor','Famous',GETDATE(),NULL)
                        ,(2,2,'P','Khan','Salman','Actor','Famous',GETDATE(),NULL)
                        ,(3,3,'P','Khan','Saif Ali','Actor','Famous',GETDATE(),NULL)
                        ,(4,4,'P','Kumar','Akshay','Actor','Famous',GETDATE(),NULL)

select * from @temp_20130426

--Insert the compared data in a new #tmp table
IF OBJECT_ID ('tempdb..#tmp') is not null
DROP TABLE #tmp

select PID
      ,SID
      ,Relationship
      ,Lname
      ,Fname
      ,Col1
      ,PII
INTO #tmp
from @temp_20130426

EXCEPT

select PID
      ,SID
      ,Relationship
      ,Lname
      ,Fname
      ,Col1
      ,PII
from @temp_20130427


IF OBJECT_ID('TEMPDB..#NEW_TABLE') IS NOT NULL
DROP TABLE #NEW_TABLE

select told.PID
      ,told.SID
      ,told.Relationship
      ,told.Lname
      ,told.Fname
      ,told.Col1
      ,told.PII 
      ,told.LastUpdated
INTO #NEW_TABLE
from #tmp t
join @temp_20130426 tOld
on tOld.PID = t.PID   

--See the different data set in #NEW_TABLE table

SELECT * FROM #NEW_TABLE

 --Flag Delete column where record does not exist in next day table
    update t
    set t.[Delete] = 1
    from @temp_20130426 t
    where PID not in (select PID from @temp_20130427)


--See the updated flagged data
select * from @temp_20130426

【讨论】:

  • 谢谢,但是当我尝试进行更新时.. --Flag Delete column where record does not exist in next day table update t set t.[Delete] = 1 from @temp_20130426 t where PID 不在(从 @temp_20130427 中选择 PID)我收到以下错误...消息 207,级别 16,状态 1,行 2 列名“删除”无效。而且还不确定如何获得表中的 Lastupdated 列。感谢您的时间,谢谢
  • @RAP - 错误“Msg 207 Invalid column name”是因为您的表 temp_20130426 没有删除列。您需要将 DELETE 列添加到表中在运行 UPDATE 之前。使用以下 SQL 添加 - ALTER TABLE temp_20130426 ADD [DELETE] BIT NULL 为了添加 LastUpdated,我已经修改了我的代码。让我知道它是否有效。
  • 这是完美的,我正在寻找的开始。我有类似的 30 个文件,我必须检查每天的数据并写入与第二天数据不匹配的新表。 . 可以在一个存储过程中做到这一点吗?
  • 是的,我已经点击了正确的选项,一旦它对我们的流程运行良好,它必须首先手动运行,我们可以将它包含在我们目前拥有的夜间维护计划中。感谢您的时间和精力-谢谢
  • 有人可以帮助我们读取一个月的文件 - 每天每个表 - 并对每一列进行增量并将该增量加载到新表中,感谢您的帮助!!
【解决方案2】:

可以为空的列需要包裹在 ISNULL 中以进行连接比较,但这应该会让您每天丢失所有记录。

select oldt.*,1
from temp_20130426 oldt
left join temp_20130427 newt ON 
        oldt.[PID]=newt.[PID]
    AND oldt.[SID]=newt.[SID]
    AND oldt.[Relationship]=newt.[Relationship]
    AND oldt.[LName]=newt.[LName]
    AND oldt.[FName]=newt.[FName]
    AND oldt.[Col1]=newt.[Col1]
    AND oldt.[PII]=newt.[PII]
WHERE newt.[PID] IS NULL

【讨论】:

    猜你喜欢
    • 2014-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多