SQL - Copy Data Within Same Table

前端 未结 4 477
谎友^
谎友^ 2021-01-16 19:58

I\'m not that great with SQL Server, but I\'m trying to do some behind the scenes work to create some functionality that our EMR system lacks - copying forms (and all their

4条回答
  •  失恋的感觉
    2021-01-16 20:48

    Made a little fiddle as an example, here (link)

    The solution is perhaps needlessly complex but it offers a good variety of other useful stuff as well, I just wanted to test how to build that dynamically. The script does print out the commands, making it relatively easy to remove the TSQL and just produce the plain-SQL to do as you wish.

    What it does, is that it requires an encounter_id, which it will then use to dynamically fetch the columns (with the assumption that encounter_id is the PK for TABLE_1) to insert a new record in TABLE_1, store the inserted.encounter_id value, and use that value to fetch and copy the matching rows from TABLE_2 and TABLE_3.

    Basically, as long as the structure is correct (TABLE_1 PK is encounter_id which is an identity type), you should be able to just change the table names referenced in the script and it should work directly regardless of which types of columns (and how many of them) your particular tables have.

    The beef of the script is this:

    /* 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
    

提交回复
热议问题