【发布时间】:2025-09-30 16:05:02
【问题描述】:
我需要将多个用户和电话号码插入电话簿。我在 .csv 文件中有用户及其电话号码,我需要将此数据添加到共享 FK uniqeidentifier 的多个表中。标识符是在用户表中创建用户时生成的。
- 我怎样才能做到这一点?
- 我怎样才能在最 有效的方法可行吗?
我尝试过的以及我想做的(但这不起作用):
CREATE TABLE Users(
UserID uniqeidentifier NOT NULL
DEFAULT newid(),
Firstname nvarchar (25),
Lastname nvarchar(25)
)
GO
CREATE TABLE Phonebook(
Number nvarchar (25),
UserID uniqeidentifier
)
GO
CREATE TABLE #TempImportedUsers(
firstname nvarchar(25),
lastname nvarchar(25),
phonenumber nvarchar(25)
)
GO
BULK INSERT #TempImportedUsers
FROM 'D:\import.csv'
WITH
(
FIRSTROW = 2,
FIELDTERMINATOR = ',',
ROWTERMINATOR = '\n',
Tablock
)
GO
INSERT INTO Users (Firstname, Lastname)
OUTPUT #TempImportedUsers.phonenumber,Inserted.UserID INTO Phonebook(Number, UserID)
SELECT
firstname,
lastname
FROM
#TempImportedUsers
D:\import.csv 的内容:
Firstname,Lastname,Number
Foo,Bar,3311664499
Baz,Qux,8844331166
显然上述方法不起作用,因为OUTPUT #TempImportedUsers.phonenumber,Inserted.UserID INTO Phonebook(Number, UserID) 无效。
我怎样才能实现这种导入?我必须使用游标吗?
【问题讨论】:
-
这是一次性导入还是需要重复执行的操作。无论哪种方式,如果您在临时表中有一个列作为主键,这会容易得多。
-
如果您认为这会有所帮助,我绝对可以在临时表中添加一列。不过,我看不出这有什么帮助,因为 *.csv 中的导入数据不包含任何键。如果我可以根据 OUTPUT 子句执行“UPDATE #temptable SET id”之类的操作,我会明白这一点,但我认为这是不可能的。如果您有任何想法,请给出一个代码示例。
-
或者您是否建议我为临时表中的每个用户创建自己的 uniqeidentifier,然后使用该标识符将用户和电话号码添加到他们的表中?我想这可能会奏效,除非在#temptable 中生成我自己的标识符有任何潜在的不利影响?
-
我不知道我会使用唯一标识符。这似乎有点矫枉过正,除非您要将其持久化到您的表格中。我不能真正“给出代码”,因为这里没有太多定义。没有表格、样本数据等...
-
@SeanLange 我的想法是将其保留到实际表中,是的。我已经编辑了我的问题以包含示例数据,以及从那里开始的表格。如果您需要任何进一步的信息来提出解决方案,请告诉我。
标签: sql sql-server tsql import insert