【问题标题】:Adding new data to the existing tables of a database in SQL Server using table variables使用表变量将新数据添加到 SQL Server 中数据库的现有表中
【发布时间】:2018-09-06 08:05:00
【问题描述】:

我正在尝试使用表变量将新行添加到数据库中的现有表中。我面临的问题是由于数据库中的自动增量主键。表格如下:

表 1:State - ID_State(PK)

| state     |ID_State |
|-----------|---------|
| Karnataka | 1       |
| Tamil Nadu| 2       |    
| UP        | 3       |
|    .      | 4       |
|    .      | .       |
|    .      | .       |

表 2:City - ID_city(PK)

| City      | ID_City | ID_State|
|-----------|---------|---------|
| Chennai   | 1       | 2       |
| Bengaluru | 2       | 1       |
| Lucknow   | 3       | 3       |
| Mysore    | 4       | 1       |
|   .       | .       | .       |
|   .       | .       | .       |

表 3:Location - ID_Location(PK)、ID_City(FK)

| Zip  | ID_Location | ID_City |
|------|-------------|---------|
| 0001 | 1           | 1       |
| 0011 | 2           | 2       |
| 0002 | 3           | 1       |
| 0022 | 4           | 2       |
| 0003 | 5           | 1       |
| 0012 | 6           | 2       |
| .    | .           | .       |
| .    | .           | .       |

另一方面,我有一个 Excel 工作表中的数据,我想将其添加到现有数据库中。这主要是为了添加以前缺少的邮政编码。

Excel 工作表中的数据:

| Zip  | City        |      State       |
|------|-------------|------------------|
| 0001 | Chennai     | Tamil Nadu       |
| 0002 | Chennai     | Tamil Nadu       |
| 0003 | Chennai     | Tamil Nadu       |
| 0004 | Chennai     | Tamil Nadu       |
| 0005 | Chennai     | Tamil Nadu       |
| 0011 | Bengaluru   | Karnataka        |
| 0022 | Bengaluru   | Karnataka        |
| 0033 | Bengaluru   | Karnataka        |
| 0044 | Bengaluru   | Karnataka        |
| 1111 | Lucknow     | UP               |
| 2222 | Lucknow     | UP               |
| 3333 | Lucknow     | UP               |
|  .   | .           | .                |
|  .   | .           | .                |

主要座右铭是添加原始数据库中缺少的任何邮政编码和城市。我编写了以下脚本,其中使用了表变量。

DECLARE @temp TABLE (Zip_Code NVARCHAR(100) PRIMARY KEY,
                     City NVARCHAR(100),
                     State NVARCHAR(100)
                    ) 

INSERT INTO @temp (Zip_Code, City, State) 
VALUES ('0001', 'Chennai'), ('0002', 'Chennai')
.
.
.
.

select * 
from @temp
where City not in (select City from City)

select * from @temp
where Zip not in (select Zip from Location)

这些查询返回不在当前数据库中的行。我需要添加它们,但不知道如何使用表变量来处理它。任何帮助将非常感激。谢谢!

P.S:我已经使用临时表并通过向现有表添加新列来实现这一点。为了减少对现有数据库的改动,尝试使用表变量来实现。

【问题讨论】:

  • 听说过insert into () select from
  • 表变量可以像任何其他表一样被引用。您说您已经使用临时表完成了这项工作?为什么你认为你需要使用表变量来重建它?
  • @SeanLange 这是因为我在尝试添加新数据时不需要任何新表或新日志文件。
  • 这对我来说没有意义。这与使用表变量而不是临时表有什么关系?您是否意识到无法索引表变量,它们没有统计信息。如果行数超过 1,000 行,则性能会很快开始下降。由于您已经完成了这项工作,因此我看不到更改为表变量的好处。

标签: sql sql-server temp-tables table-variable


【解决方案1】:

比你想象的要难,但不是太难。

您需要自己弄清楚 zip。

set nocount on;
declare @S table (id int identity primary key, val varchar(20));
insert into @S (val) values 
       ('Karnataka')
     , ('Tamil Nadu');
select * from @S s order by s.val;  
-- table variable does not have declared foreign key relationships
declare @C table (id int identity primary key, val varchar(20), fkState int);
insert into @C (val, fkState) values
       ('Chennai', 1)
     , ('Bengaluru', 1)
     , ('Mysoe', 1)
     , ('Lucknow', 2);
select c.val as city, s.val  as state
from @C c 
join @S s
  on s.id = c.fkState
order by s.val, c.val;
declare @L table (city varchar(20) not null, state varchar(20) not null, primary key (city, state));
insert into @L values
       ('Chennai', 'Karnataka')
     , ('Barsel', 'Karnataka')
     , ('South', 'Penn');
insert into @S 
select distinct l.state
from @L l 
where not exists ( select 1 
                   from @S s 
                   where s.val = l.state 
                 ); 
select * from @S s order by s.val; 
insert into @C (val, fkState) 
select city, s.id 
from @L l 
join @S s 
  on s.val = l.state 
where not exists ( select 1 
                   from @C c 
                   where c.val = l.city 
                   and c.fkState = s.id
                 );
select c.val as city, s.val  as state 
from @C c 
join @S s
  on s.id = c.fkState
order by s.val, c.val;

id          val
----------- --------------------
1           Karnataka
2           Tamil Nadu

city                 state
-------------------- --------------------
Bengaluru            Karnataka
Chennai              Karnataka
Mysoe                Karnataka
Lucknow              Tamil Nadu

id          val
----------- --------------------
1           Karnataka
3           Penn
2           Tamil Nadu

city                 state
-------------------- --------------------
Barsel               Karnataka
Bengaluru            Karnataka
Chennai              Karnataka
Mysoe                Karnataka
South                Penn
Lucknow              Tamil Nadu

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-20
    • 1970-01-01
    • 2013-07-17
    相关资源
    最近更新 更多