Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 将临时表中的数据插入现有表_Sql_Sql Server - Fatal编程技术网

Sql 将临时表中的数据插入现有表

Sql 将临时表中的数据插入现有表,sql,sql-server,Sql,Sql Server,我创建了一个查询来从源表中提取和操作数据,然后该查询将其添加到一个临时表中。然后,一个单独的查询使用临时表中的数据并创建一个新表 源表现在已更新为新行,我需要向表中添加新角色。但是,我不确定在这种情况下如何更新现有表,而不是创建新表。这是我的密码: select ID, Date, rtrim(ltrim(replace(AccountNumber,'AccountNumber: ',''))) 'AccountNumber', replace(MPAN,'MPAN: ','') 'MPAN'

我创建了一个查询来从源表中提取和操作数据,然后该查询将其添加到一个临时表中。然后,一个单独的查询使用临时表中的数据并创建一个新表

源表现在已更新为新行,我需要向表中添加新角色。但是,我不确定在这种情况下如何更新现有表,而不是创建新表。这是我的密码:

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
我想知道它是否像使用“INSERT INTO[TABLE]”再次运行此查询一样简单,以更新现有的表,但我不确定,也没有在网上找到任何可以为我的情况提供明确答案的信息

这是我自己创建的第一个表,也是我第一次使用查询更新现有表。所以当我不确定的时候,我有点担心做出改变


提前谢谢

希望你喜欢在电气行业工作

如果我理解正确,你有一个来源[表格],那么一个#诱人的

您正在从[Table]中提取数据并对其进行操作,然后希望将其放回[Table]中。这应该通过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]中的值来更新#tentable]——如果字段名相同,那么这将很困难

EDIT2:如果您担心更新源表,您可能需要查看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

当您对更新感到满意时,将ROLLBACK TRANSACTION设置为COMMIT TRANSACTION

考虑使用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
MERGE[作为目标]
使用[作为来源]
ON——例如ColumnSource=ColumnTable
匹配时--行已存在
然后更新目标_表集--例如,是否进行更新
未与目标匹配时--目标表上不存在行
然后插入(…)值(…)--例如,插入
不按源匹配时--源表上不存在行,但目标表上存在行
然后删除--例如,请删除

这里的关键是确保您可以将以前创建的记录与新临时表上的新记录相匹配。我们在这里使用主键(或者可以明确标识所有行的任何列组合)。然后,只需通过这些列将临时文件与物理文件连接起来,即可执行
更新。如果您有新记录,您还需要一个
插入
(甚至
删除
)。
MERGE
操作可以一次完成所有操作。我不完全理解您想要做什么,但是
INSERT-INTO
用于创建新表,而不是更新现有表。我有三个表[源],[临时],[新]。我的查询用于将数据从[SOURCE]操作到[TEMP],然后再从[TEMP]操作到[NEW]。[NEW]中的现有数据没有更改,但新的行已添加到[SOURCE](我想这是我在原始问题中不清楚的地方)。因此,我需要再次完成此过程,然后将新行添加到[new]。感谢您的回答,但我认为我的解释不正确。我有三张表[来源],[临时],[新]。我的查询用于将数据从[SOURCE]操作到[TEMP],然后再从[TEMP]操作到[NEW]。[NEW]中的现有数据没有更改,但新的行已添加到[SOURCE](我想这是我在原始问题中不清楚的地方)。因此,我需要再次执行该过程,然后将新行添加到[new]。我希望这样更好。如果所有3个都有相同的主键字段,这应该是一个问题。如果[NEW]不存在,那么您可以从[TEMP]执行另一个SELECT INTO查询,我想我就快到了。运行[TEMP]后,我尝试使用“插入[NEW]从[TEMP]中选择(第1列、第2列等)”。但是,这复制了[NEW]中已经存在的数据。有没有一种方法可以在不重新添加现有行的情况下将新行添加到[new]中?通过主键将左键连接到新表,目标表中不存在[new].[ID]为NULL的任何位置,这就是您应该用于insert select语句的位置