我对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