使用临时表来查询和更新现有表

时间:2016-06-13 17:53:07

标签: sql sql-server

我仍然是使用SQL的新手,这个查询让我特别困惑。

我正在将一个.CSV文件导入一个临时表(它只有1列宽并且导入正常但第一行除外,因为某些原因是空白的)以便更新表格匹配导入列时的现有数据库。

我遇到的问题是它只匹配导入表中的最后一个条目,并且只更新现有表中的1条记录。 .CSV文件是从扩展生成的,而扩展又是从现有数据库的查询生成的,因此我知道名称是正确的,并且它们位于临时表中。

我已经看到了几个类似的查询问题/解决方案,并尝试使用他们的部分解决方案无济于事,我希望这个社区可以帮助我!

if object_id('dbo.namefile', 'u') is not null 
    drop table dbo.namefile

create table dbo.namefile
(
    name varchar(255) not null primary key
    --constraint pk_t1_name check(name not like 'zzzzzzz')
)

bulk insert dbo.namefile
from 'f:\list.csv'
with (datafiletype = 'char',
      fieldterminator = '","',
      rowterminator = '\r',
      errorfile = 'f:\inp_err.log') 

update dbo.MeasurementLimit 
set LowLimit = 1
from namefile as nf
join EntityName as en on en.EntityName = nf.name
join MeasurementLimit as ml on en.uid = ml.UID
where en.EntityName = nf.name

感谢您的帮助

今天早上我试过这个

select * from namefile  

它返回了113个记录list.csv文件中正确的条目数

但这仅返回1条记录

select * from namefile nf  
 inner join Entityname as en on en.Entityname = nf.listname  

Entityname table

Measurementlist

2 个答案:

答案 0 :(得分:0)

我的猜测是问题是你没有使用update的别名。这个版本怎么样:

update ml
    set LowLimit = 1
from namefile as nf join
     EntityName as en 
     on en.EntityName = nf.name join
     MeasurementLimit as ml
     on en.uid = ml.UID
where en.EntityName = nf.name;

答案 1 :(得分:0)

解决方案是在批量插入中..原始代码(上面)将在单个列csv文件中读取,但它还向表中添加了一个空白记录,这会搞砸您将针对它运行的任何查询更正的插入代码是

bulk insert namefile  
from 'f:\list.csv'  
(  
datafiletype = 'char',  
fieldterminator = ',',  <========= This was wrong  
rowterminator = '\n',<====== and this was wrong  
errorfile = 'f:\inp_err.log'  
);