【发布时间】: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