当前位置: 首页 > 面试题库 >

SQL Server:是否可以同时插入两个表?

谢鸿飞
2023-03-14
问题内容

我的数据库包含三个表叫Object_TableData_TableLink_Table。链接表仅包含两列,即对象记录的标识和数据记录的标识。

我想从DATA_TABLE链接到一个给定对象标识的位置复制数据,Data_TableLink_Table在不同的给定对象标识中插入相应的记录。

可以 通过选择一个表变量,并为每次迭代进行两次插入来循环执行此操作。

这是最好的方法吗?

编辑 :我想避免循环的原因有两个,第一个是我很懒,并且循环/临时表需要更多的代码,更多的代码意味着有更多的地方出错,第二个原因是对性能的关注。

我可以在一个插入中复制所有数据,但是如何获得链接表以链接到新数据记录,其中每个记录都有一个新的ID?


问题答案:

下面使用表变量设置我遇到的情况。

DECLARE @Object_Table TABLE
(
    Id INT NOT NULL PRIMARY KEY
)

DECLARE @Link_Table TABLE
(
    ObjectId INT NOT NULL,
    DataId INT NOT NULL
)

DECLARE @Data_Table TABLE
(
    Id INT NOT NULL Identity(1,1),
    Data VARCHAR(50) NOT NULL
)

-- create two objects '1' and '2'
INSERT INTO @Object_Table (Id) VALUES (1)
INSERT INTO @Object_Table (Id) VALUES (2)

-- create some data
INSERT INTO @Data_Table (Data) VALUES ('Data One')
INSERT INTO @Data_Table (Data) VALUES ('Data Two')

-- link all data to first object
INSERT INTO @Link_Table (ObjectId, DataId)
SELECT Objects.Id, Data.Id
FROM @Object_Table AS Objects, @Data_Table AS Data
WHERE Objects.Id = 1

感谢另一个指向OUTPUT子句的答案,我可以演示一个解决方案:

-- now I want to copy the data from from object 1 to object 2 without looping
INSERT INTO @Data_Table (Data)
OUTPUT 2, INSERTED.Id INTO @Link_Table (ObjectId, DataId)
SELECT Data.Data
FROM @Data_Table AS Data INNER JOIN @Link_Table AS Link ON Data.Id = Link.DataId
                INNER JOIN @Object_Table AS Objects ON Link.ObjectId = Objects.Id 
WHERE Objects.Id = 1

但是事实证明,由于以下错误,在现实生活中并非如此简单

OUTPUT INTO子句不能位于(主键,外键)关系的任一侧

我仍然可以OUTPUT INTO使用临时表,然后以正常插入结束。因此,我可以避免循环,但无法避免临时表。



 类似资料:
  • 问题内容: 是否可以使用javascript或Submit按钮同时提交两个表单? 表单结构可以如下所示: 并从两个数组中获取数据? 问题答案: 不,这是不可能的。您可以创建第三个隐藏表格,该表格将序列化这两个表格中的字段。 如果可以使用jQuery: 您需要确保str1和str2不为空,并且当然要避免两种形式之间的名称冲突。

  • 是否可以同时从套接字读取和写入?我有一个连续读取套接字的线程。由于只有一个线程从套接字读取,因此读取操作是线程安全的。现在我有很多线程(比如 100 个)写入套接字。因此,很明显,我必须通过做这样的事情来使写入操作线程安全, 现在我有一个线程不断调用readMessage()函数(在while循环中)。据我所知,如果套接字上没有要读取的消息,语句< code > inputstream . rea

  • 问题内容: 我知道我可以这样做: 然后只需编写语句中所需的代码。 还有其他方法可以检查它们是否相等? 问题答案: 怎么了 if(!Arrays.equals(array1,array2)) 与相同,即是同一数组。这不是大多数人期望的。 比较数组的内容。

  • 问题内容: JVM是否可以同时运行多个程序?如果是这样,怎么办?如果没有,为什么? 要运行程序,我们只需 但是我们可以使用同一个JVM实例来运行另一个程序吗? 问题答案: 答案取决于您对“程序”的定义。具有方法并以其开头的Java程序通常无法在同一JVM中运行,因为没有内置的资源或名称空间分隔。例如,如果两个程序使用同一库的冲突版本怎么办? 我们还提供了旨在共享JVM的应用程序,例如企业应用程序。

  • 问题内容: 我有4种方法(,,和一类)。方法,并有方法。另外,我有4个线程,,和分别。 如果访问方法(同步方法),线程访问方法(同步方法)是否可以同时进行?如果不是,则t2的状态如何? 问题答案: 如果t1访问m1方法(同步方法),t2线程可以同时访问m2方法(同步方法)吗? 该关键字适用于 目标水平 ,且只有一个线程可持有对象的锁。因此,只要您在谈论同一个对象,那么 否 ,它将等待释放进入时获得

  • 问题内容: 这是场景: ThreadA将要从某些套接字读取,并将数据写入“ MyFile.txt” ThreadB将读取“ MyFile”,到达末尾时,它将循环播放,直到MyFile中有新数据可用为止(因为我不想重新打开“ MyFile.txt”,并且浪费时间,所以我到达了从我所在的位置..)。 可以做这样的事情吗? 如果没有,还有其他方法可以做这种事情吗? 问题答案: 您提到的问题是著名的生产者