2014-01-02 3 views
0

Я не так хорош в SQL Server, но я пытаюсь сделать некоторые работы за кулисами, чтобы создать некоторую функциональность, которой не хватает нашей системе EMR - копирование форм (и всех их данных) между пациентами.SQL - копирование данных внутри одной таблицы

В 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 

Как вы можете видеть, что они весь матч вместе с encounter_id, которая связана с patient_id (В первой таблице).

То, что я пытаюсь сделать, это скопировать все строки в этих трех таблицах для конкретного экземпляра сталкиваются в той же таблице, из которой они происходят, но с другой (сгенерированной системой) встречей_id для patient_id, что я будет указывать. По сути, копирование формы от одного пациента к другому.

Любая помощь на это очень ценится.

+0

Что вы пробовали до сих пор ??? вы имеете в виду, что просто хотите изменить Encounter_ID на (сгенерированную системой) встречу для конкретного пациента во всех трех таблицах ??? –

ответ

1

Сделано немного скрипку в качестве примера, here (link)

Решение может быть, излишне сложным, но он предлагает большое разнообразие других полезных вещей, а я просто хотел проверить, как построить что динамически. Сценарий распечатывает команды, что делает относительно легким удаление TSQL и просто создает простой SQL, чтобы делать все, что вам нужно.

Что он делает, это то, что для этого требуется встретить_ид, который он будет использовать для динамического извлечения столбцов (с предположением, что сталкиваемое_и_ является PK для TABLE_1), чтобы вставить новую запись в TABLE_1, сохранить вставленный.encounter_id значение и использовать это значение для извлечения и копирования соответствующих строк из TABLE_2 и TABLE_3.

В принципе, до тех пор, пока структура правильная (TABLE_1 PK is сталкивается_id, который является типом идентификации), вы должны просто изменить имена таблиц, на которые ссылается скрипт, и работать непосредственно независимо от того, какие типы столбцов (и сколько их) ваших конкретных таблиц.

Говядина сценария заключается в следующем:

/* 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 '[email protected]+' 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 ('[email protected]+') 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 ('[email protected]+') 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 
1
declare @oldEncounterID int 
set @oldEncounterID = 1234 

declare @newEncounterID int 
set @newEncounterID = 2345 

insert into table1(encounter_id, patient_id, date, time, etc) 
select newEncounterID, patient_id, date, time, etc 
from table1 where encounter_id = oldEncounterID 

и так далее ... проблемы с этим подходом вы должны знать, в пользу того, что все столбцы, и в случае их изменения вы можете изменить столбцы соответственно

Другой подход:

declare @oldEncounterID int 
set @oldEncounterID = 1234 

declare @newEncounterID int 
set @newEncounterID = 2345 
select * into #table1 from table1 where encounter_id = oldEncounterID 
update #table1 set encounter_id = newEncounterID 
insert into table1 select * from #table1 

и т. Д. ... этот второй подход, однако, может потребоваться небольшая корректировка, если есть столбец тождества, тогда вам нужно будет установить идентификатор_интеста на

+0

Второй подход добавляет много накладных расходов, когда дублируется большое количество записей. –

1

Код псевдонауки, не проверено:

DECLARE @patient_id INT, @date datetime, @time ?? 
SET @patient_id = 112244 --your patient id 

INSERT INTO [**Table 1**] (patient_id, date, time, etc, etc, etc, etc) 
VALUES (@patient_id, @date, @time, 'a', 'b', 'c', 'd') 

DECLARE @encounter_id int 
SET @encounter_id = SCOPE_IDENTITY -- or select @encounter_id = encounter_id from [**Table 1**] where patientId = @patient_id 

INSERT INTO [**Table 2**] (encounter_id, page, recorded_on, recorded_by, etc, etc2) 
SELECT @encounter_id, page, recorded_on, recorded_by, etc, etc2 
FROM [**Table 2**] 
WHERE encounter_id = 1234 

INSERT INTO [**Table 3**] (encounter_id, page, keyname, keyvalue) 
SELECT @encounter_id, page, keyname, keyvalue 
FROM [**Table 3**] 
WHERE encounter_id = 1234 
+0

Если есть действительно определенный столбец идентификации, просто вставьте без указания столбца. –

+0

@ CRAFTYDBA - способ, которым описывается его вопрос, встречается в первой таблице, а fk - на двух других. – iii

2

Мне всегда нравится создавать таблицы образцов в [tempdb], чтобы синтаксис был правильным. Я создал таблицы [t1], [t2] и [t3]. Есть первичные и внешние ключи.

Если у вас хорошо развитая схема, ERD (диаграмма отношения сущностей) http://en.wikipedia.org/wiki/Entity-relationship_diagram, эти отношения должны быть на месте.

-- Playing around 
use tempdb 
go 


-- 
-- Table 1 
-- 

-- Remove if it exists 
if object_id('t1') > 0 
drop table t1 
go 

-- Create the first table 
create table t1 
(
encounter_id int, 
patient_id int, 
the_date date, 
the_time time, 
constraint pk_t1 primary key (encounter_id) 
); 
go 

-- Add one row 
insert into t1 values (1234, 112233, '2014-01-02', '14:25:01:00'); 
go 

-- Show the data 
select * from t1 
go 


-- 
-- Table 2 
-- 

-- Remove if it exists 
if object_id('t2') > 0 
drop table t2 
go 

-- Create the second table 
create table t2 
(
encounter_id int, 
the_page int, 
recorded_on date, 
recorded_by int, 
constraint pk_t2 primary key (encounter_id, the_page) 
); 
go 

-- Add two rows 
insert into t2 values 
(1234, 1, '2014-01-02', 134), 
(1234, 2, '2014-01-02', 134);  
go 

-- Show the data 
select * from t2 
go 

-- 
-- Table 3 
-- 

-- Remove if it exists 
if object_id('t3') > 0 
drop table t3 
go 

-- Create the third table 
create table t3 
(
encounter_id int, 
the_page int, 
key_name1 varchar(16), 
key_value1 varchar(16), 
constraint pk_t3 primary key (encounter_id, the_page, key_name1) 
); 
go 

-- Add seven rows 
insert into t3 values 
(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'); 
go 

-- Show the data 
select * from t3 
go 

-- 
-- Foreign Keys 
-- 

alter table t2 with check 
add constraint fk_t2 foreign key (encounter_id) 
references t1 (encounter_id); 

alter table t3 with check 
add constraint fk_t3 foreign key (encounter_id, the_page) 
references t2 (encounter_id, the_page); 

Здесь представлена ​​интересная часть, хранимая процедура для дублирования данных.

-- 
-- Procedure to duplicate one record 
-- 

-- Remove if it exists 
if object_id('usp_Duplicate_Data') > 0 
drop procedure t1 
go 

-- Create the procedure 
create procedure usp_Duplicate_Data @OldId int, @NewId int 
as 
begin 

    -- Duplicate table 1's data 
    insert into t1 
    select 
    @NewId, 
    patient_id, 
    the_date, 
    the_time 
    from t1 
    where encounter_id = @OldId; 

    -- Duplicate table 2's data 
    insert into t2 
    select 
    @NewId, 
    the_page, 
    recorded_on, 
    recorded_by 
    from t2 
    where encounter_id = @OldId; 

    -- Duplicate table 3's data 
    insert into t3 
    select 
    @NewId, 
    the_page, 
    key_name1, 
    key_value1 
    from t3 
    where encounter_id = @OldId; 

end 

И наконец, мы должны вызвать хранимую процедуру, чтобы убедиться, что она работает.

-- Sample call 
exec usp_Duplicate_Data 1234, 7777 

Таким образом, я не добавлял ошибок и не учитывал диапазон идентификаторов. Я оставляю эти задания для вас, чтобы учиться.

enter image description here

+0

Две вещи, чтобы рассмотреть. Вы всегда можете использовать отрицательный результат столкновения_id как фальшивую запись. Кроме того, вам действительно нужны данные в одной таблице? Вы всегда можете создать одну и ту же таблицу в другой схеме [duped]. [T1], [duped]. [T2] и [duped]. [T3]. Работа ETL или триггер может также дублировать данные. Удачи с вашим проектом! –

Смежные вопросы