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

SQL-在同一表中复制数据

咸亦
2023-03-14
问题内容

我对SQL Server不太满意,但是我试图在后台做一些工作来创建我们的EMR系统所缺乏的某些功能-在患者之间复制表格(及其所有数据)。

在SQL Server 2008 R2中,我有三个表来处理已填写的这些表格:

**Table 1**
encounter_id  patient_id  date        time          etc  etc  etc  etc
1234          112233      2014-01-02  14:25:01:00   a    b    c    d

**Table 2**
encounter_id  page  recorded_on  recorded_by  etc   etc
1234          1     2014-01-02   134          asdf  asdf
1234          2     2014-01-02   134          jkl;  jkl;

**Table 3**
encounter_id  page  keyname  keyvalue
1234          1     key1     aaa
1234          1     key2     bbb
1234          1     key3     ccc
1234          1     key4     ddd
1234          2     key5     eee
1234          2     key6     fff
1234          2     key7     ggg

如您所见,它们都与match_id匹配,后者被链接到Patient_id(在第一张表中)。

我想要做的是将这三个表中所有的行复制为一个特定的match_id,重新复制到它们来自的同一表中,但是为我指定的Patient_id使用不同的(系统生成的)遭遇标识。本质上,是将表格从一个患者复制到另一个患者。

在此方面的任何帮助将不胜感激。


问题答案:

以小提琴为例,在这里(链接)

该解决方案也许不必要地复杂,但是它还提供了许多其他有用的东西,我只是想测试如何动态地构建它。该脚本确实会打印出命令,从而使删除TSQL相对容易,并且只需生成纯SQL即可完成您想做的事情。

它所要做的是,它需要一个meeting_id,然后它将使用它来动态获取列(假设遇到的id是TABLE_1的PK),以便在TABLE_1中插入新记录,存储insertd.encounter_id值并使用该值以获取并复制TABLE_2和TABLE_3中的匹配行。

基本上,只要结构正确(TABLE_1
PK是遭遇类型,它是一种身份类型),您就应该能够只更改脚本中引用的表名,并且无论哪种列类型(以及多少列),它都可以直接工作。其中的一个)您的特定表。

脚本的主要内容是:

/* Script begins here */
DECLARE @ENCOUNTER_ID INT, @NEWID INT, @SQL VARCHAR(MAX), @COLUMNS VARCHAR(MAX)
IF OBJECT_ID('tempdb..##NEW_ID') IS NOT NULL
    DROP TABLE ##NEW_ID
CREATE TABLE ##NEW_ID (ID INT)

/* !!! SET YOUR DESIRED encounter_id RECORDS TO BE COPIED, HERE !!! */
  SET @ENCOUNTER_ID = 1234

IF EXISTS (SELECT TOP 1 1 FROM TABLE_1 WHERE encounter_id = @ENCOUNTER_ID)
BEGIN
    SELECT @COLUMNS = COALESCE(@COLUMNS+', ', 'SELECT ')+name
    FROM sys.columns WHERE OBJECT_NAME(object_id) = 'TABLE_1' AND name <> 'encounter_id'

    SET @COLUMNS = 'INSERT INTO TABLE_1 OUTPUT inserted.encounter_id INTO ##NEW_ID '+@COLUMNS+' FROM TABLE_1 WHERE encounter_id = '+CAST(@ENCOUNTER_ID AS VARCHAR(25))

    EXEC(@COLUMNS)
    PRINT(@COLUMNS)

    SELECT TOP 1 @NEWID = ID, @COLUMNS = NULL FROM ##NEW_ID

    SELECT @COLUMNS = COALESCE(@COLUMNS+', ', '')+name
    FROM sys.columns WHERE OBJECT_NAME(object_id) = 'TABLE_2'
    SET @COLUMNS = 'INSERT INTO TABLE_2 ('+@COLUMNS+') SELECT '+REPLACE(@COLUMNS,'encounter_id',''+CAST(@NEWID AS VARCHAR(25))+'')
        +' FROM TABLE_2 WHERE encounter_id = '+CAST(@ENCOUNTER_ID AS VARCHAR(25))

    EXEC(@COLUMNS)
    PRINT(@COLUMNS)

    SET @COLUMNS = NULL

    SELECT @COLUMNS = COALESCE(@COLUMNS+', ', '')+name
    FROM sys.columns WHERE OBJECT_NAME(object_id) = 'TABLE_3'
    SET @COLUMNS = 'INSERT INTO TABLE_3 ('+@COLUMNS+') SELECT '+REPLACE(@COLUMNS,'encounter_id',''+CAST(@NEWID AS VARCHAR(25))+'')
        +' FROM TABLE_3 WHERE encounter_id = '+CAST(@ENCOUNTER_ID AS VARCHAR(25))

    EXEC(@COLUMNS)
    PRINT(@COLUMNS)

    IF OBJECT_ID('tempdb..##NEW_ID') IS NOT NULL
        DROP TABLE ##NEW_ID
END


 类似资料:
  • 问题内容: 我已经寻找了一段时间,但找不到适合我问题的简单解决方案。我想在表中复制一条记录,但是当然,唯一的主键需要更新。 我有这个查询: 问题在于,这只是更改行的,而不是复制行。有人知道如何解决这个问题吗? // edit:我想在不键入所有字段名称的情况下执行此操作,因为字段名称会随着时间变化。 问题答案: 我通常使用的方法是使用临时表。它可能在计算上效率不高,但看起来还可以!在这里,我要完全复

  • 问题内容: 我们需要将数据从一个公司复制到另一个公司,为此,我们需要将一个表中存在的所有数据复制到同一表中,但使用不同的公司ID。 表1:员工 表2:组合值 我想使用更新的companyid复制同一表中表1和表2中的所有数据 对于下面的表2是查询=>它按预期工作 结果 表2:组合值 问题 : 但是对于表1,由于表2中存在“部门”和“类别”的更新ID值,我无法执行相同操作 预期成果 表1:员工 我可

  • 问题内容: A)到目前为止我的方式: B)我想做这样的事情: 注意:我要复制到同一张表中。我只想轻松地将其全部复制到另一行,同时为新行赋予新的ID。 那是好的实践吗? 问题答案: 唯一的方法是像第一个示例一样列出所有列。没有像这样的语法 但是,出于SQL注入和计划缓存的原因,您应该使用参数化的SQL。

  • 我有一个SQL Server2000数据库,有7个表。我想将表数据从此数据库复制到运行在SQL Server2008实例上的另一个数据库。 这些表将完全相同,我只需要将数据从一个复制到另一个。 编辑: 错误0xC0024107:数据流任务1:任务验证过程中出现错误。 (SQL Server导入导出向导) 编辑:

  • 问题内容: 将所有值从表中的列复制到同一表中的另一列的最简单方法是什么? 问题答案: 使用单个语句(如果列具有相同的数据类型)

  • 在SQL Server中,如何将数据从一个表复制/追加到具有相同架构的另一个表中? 编辑: 假设有一个问题 它使用与表2中相同的模式和数据创建表1。 有没有这样的短查询只将整个数据复制到一个已经存在的表中?