我创建了一个查询来从源表中提取和操作数据,然后查询将其添加到临时表中。然后,单独的查询使用临时表中的数据并创建一个新表。
源表现已更新为新行,我需要将新角色添加到我的表中。但是,我不确定在这种情况下我将如何更新现有表,而不是创建一个新表。这是我的代码:
select ID, Date,
rtrim(ltrim(replace(AccountNumber,'AccountNumber: ',''))) 'AccountNumber',
replace(MPAN,'MPAN: ','') 'MPAN',
replace(MSN,'MeterSerialNumber: ','') 'MSN',
replace(ReadingDate,'ReadingDate: ','') 'ReadingDate',
replace(RegisterID1,'RegisterID1: ','') 'RegisterID1',
replace(Reading1,'Reading1: ','') 'Reading1',
replace(RegisterID2,'RegisterID2: ','') 'RegisterID2',
replace(Reading2,'Reading2: ','') 'Reading2',
Status
INTO [NEW TABLE]
FROM #TEMPTABLE
Order by date desc
drop table #TEMPTABLE
我想知道它是否像使用"插入 [TABLE]"再次运行此查询来更新现有表一样简单,但我不确定,也没有在网上找到任何可以让我明确回答我的情况的东西。
这是我自己创建的第一个表,这将是我第一次使用查询来更新现有表。因此,当我不确定时,我有点担心进行更改。
提前谢谢。
希望您喜欢在电子行业工作。
如果我理解正确,您有一个来源[表],然后是 #TempTable。
您正在从 [表] 中提取数据并对其进行操作,然后您想将其放回 [表] 中。这应该通过 UPDATE 语句完成,为了最好地做到这一点,请从 [Table] 中获取主键。
--Get your Temporary Data
SELECT
ID,
MPAN,
MSN,
--etc...
INTO #TEMPTABLE
FROM [Table]
--DO your data manipulation
UPDATE #TEMPTABLE
SET MSN = LTRIM(RTRIM(MSN)) --Or whatever your actions are
--Show that your changes have been applied correctly
SELECT * FROM #TEMPTABLE
--apply values back to source table
UPDATE org
SET org.MPAN = tmp.MPAN,
org.MSN = tmp.MSN
FROM #TEMPTABLE tmp
INNER JOIN [Table] org ON org.ID = tmp.ID
编辑:我注意到你在说如果源数据发生了变化,即[表中的数据],你将如何处理这个问题。在这种情况下,您将反向进行更新,因此您将使用 [Table] 中的值更新 #TEMPTABLE - 如果字段名称相同,这应该很困难。
编辑2:如果您担心更新源表,您可能需要查看SQL Server中的事务。您可以执行一些SQL,查看更改,然后在事务开始时将所做的任何操作回滚到数据状态。
BEGIN TRANSACTION
SELECT * FROM [Table] WHERE ID = 12 --Still there
DELETE FROM [TABLE] WHERE ID = 12 --Example
SELECT * FROM [Table] WHERE ID = 12 --No longer there
ROLLBACK TRANSACTION
SELECT * FROM [Table] WHERE ID = 12 --Still there
当您对更新感到满意时,将"回滚事务"设置为"提交事务"
考虑使用 MERGE,它要么更新现有行,要么从源插入目标表中尚不存在的新行,或者如果目标表中有行但源表中不存在,甚至执行某些操作
MERGE <target_table> [AS TARGET]
USING <table_source> [AS SOURCE]
ON <search_condition> --For example ColumnSource = ColumnTable
WHEN MATCHED --Rows already exist
THEN UPDATE target_table SET ... --Do Update for example
WHEN NOT MATCHED BY TARGET --Rows not exist on Target Table
THEN INSERT(...) VALUES(...) --Do Insert for example
WHEN NOT MATCHED BY SOURCE --Rows not exist on Source table but exists on Target Table
THEN DELETE ... --Do Delete for example