Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL:是否可以将自动生成的id输出从第一个表插入到第二个表中,同时插入到两个表中_Sql_Sql Server_Insert_Output_Sqltransaction - Fatal编程技术网

SQL:是否可以将自动生成的id输出从第一个表插入到第二个表中,同时插入到两个表中

SQL:是否可以将自动生成的id输出从第一个表插入到第二个表中,同时插入到两个表中,sql,sql-server,insert,output,sqltransaction,Sql,Sql Server,Insert,Output,Sqltransaction,我的数据库包含两个表FileStore和FileRepository FileStore表包含3列Id(自动生成的uniqueidentifier)、FileName和Description ->使用演示数据处于初始状态 FileRepository表包含3列Id(自动生成的uniqueidentifier)、Name和FileId(这是指FileStore表中的Id列)->以及演示数据的初始状态 我得到一个文件存储ID数组作为搜索条件。同样,我需要首先在FileStore表中为满足的每个条

我的数据库包含两个表FileStore和FileRepository

FileStore表包含3列Id(自动生成的uniqueidentifier)、FileName和Description ->使用演示数据处于初始状态

FileRepository表包含3列Id(自动生成的uniqueidentifier)、Name和FileId(这是指FileStore表中的Id列)->以及演示数据的初始状态

我得到一个文件存储ID数组作为搜索条件。同样,我需要首先在FileStore表中为满足的每个条件创建一个重复的行。我还需要基于FileId列上的相同数据为第二个表FileRepository创建重复行。但我需要用FileStore操作中自动生成的Id列更新新创建的行的FileId列

如果我需要复制文件1(Idb3304dc4-4f2e-46d4-8f64-a597edb02e96)和文件2(Id7cb40baf-1ecf-4e5f-92ff-57029a20e623),请参考随附的图像。这是操作后表格应具有的数据 复制后的文件存储数据库应具有以下数据:

复制后的FileRepository数据库应具有以下数据:

哪种方法最好?是否可以通过不带任何循环的查询来实现这一点

对于第一个表,我可以插入并获得插入的ID,因此:

INSERT INTO FileStore(FileName,Description)
OUTPUT INSERTED.Id as InsertedIds
SELECT
FileName, Description
from FileStore
where Id IN ('b3304dc4-4f2e-46d4-8f64-a597edb02e96','7cb40baf-1ecf-4e5f-92ff-57029a20e623')
但是不确定更新FileRepository表的查询,该表将insertedID作为输入

INSERT INTO FileRepository(Name,FileId)
SELECT
Name, {{How do I use InsertedDetails here?}}
from FileRepository
where FileId IN ('b3304dc4-4f2e-46d4-8f64-a597edb02e96','7cb40baf-1ecf-4e5f-92ff-57029a20e623')
PS:这只是我为这个问题创建的参考表。如果我需要说得更清楚,请告诉我

  • 首先,插入父表的数据
  • 然后

    INSERT INTO FileRepository (`id`, `Name`,`FileId`)   
    VALUES('id_or_auto_generated','name value', SELECT SCOPE_IDENTITY())
    
  • 选择SCOPE_IDENTITY();将返回最近自动生成的SQL server数据库连接id


    对于其他数据库:

    正如我提到的,您需要使用
    OUTPUT
    子句。这是在缺少可消耗样本数据和预期结果的情况下的伪SQL。您需要适当地删除/更改大括号(
    {}
    )中的部分:

    DECLARE @Output table (ID uniqueindentifier,
                           {Other Columns});
    
    INSERT INTO FileStore(FileName,Description)
    OUTPUT INSERTED.Id, {Other Columns}
    INTO @Output
    SELECT FileName,
           Description
    from FileStore
    where Id IN ('b3304dc4-4f2e-46d4-8f64-a597edb02e96','7cb40baf-1ecf-4e5f-92ff-57029a20e623');
    
    INSERT INTO FileRepository(Name,FileId)
    SELECT FR.Name,
           O.ID
    from FileRepository FR
         {CROSS} JOIN @Output O {ON Some Condition}
    where FileId IN ('b3304dc4-4f2e-46d4-8f64-a597edb02e96','7cb40baf-1ecf-4e5f-92ff-57029a20e623')
    

    DML语句一次只能影响一个对象。如果需要影响多个对象,则需要多个语句。似乎您只需要在这里使用
    OUTPUT
    子句来获取插入的数据,然后
    INSERT
    将其插入到另一个表中?要回答您的问题“有没有可能通过一个没有任何循环的查询来实现这一点”,您很少需要SQL中的循环。SQL不是一种编程语言,它是一种查询语言;它擅长基于集合的解决方案,但在迭代的解决方案中表现不佳。如果你想循环,你可能做得不对。即使我也有使用OUTPUT子句的相同假设,但我不确定当我们有多个返回值
    OUTPUT
    返回一个数据集时是否使用它,所以我不确定当你有多个值时你的意思是什么<代码>输出只能返回一个数据集,不是很多。可能我不清楚我有什么疑问。我同意OUTPUT子句返回一个数据集。我需要将返回的Id输入到第二个表映射中,根据该映射,file duplicated返回相应的Id。映射表实际上需要更新accordingly@Larnu已更新我的问题以使其更清晰上次\u INSERT\u ID()/SCOPE\u IDENTITY()返回第一个生成的整数。所以这对我来说是行不通的是的。但是自动生成的Id列是唯一的。如果您觉得这个答案没有帮助,我将非常感谢您解释原因,以便我可以改进它。非常感谢。