【问题标题】:How to create table via trigger that name as one of data that inserted如何通过触发器创建表作为插入的数据之一
【发布时间】:2012-08-03 16:21:37
【问题描述】:

我想要一个在将数据添加到表时创建表的触发器。表名必须是插入的条目的名称。

示例:当患者在医院登记时,会将一行插入到paitientDetail 表中。触发器必须创建包含患者姓名的表。

【问题讨论】:

  • 您使用的是哪个 RDBMS?您标记了 MySQL 和 sql-server?你真的想为每个病人单独一张桌子吗?这尖叫着糟糕的设计。您将遇到为每位患者单独设置表格的问题。
  • 为了所有美好和圣洁的爱,你为什么要这样做?该患者姓名表中存储了什么?为什么不能只使用一张包含所有患者的表并使用外键?
  • 您确实需要审查设计。如果你的脑海中突然冒出这样的想法,或者认为这样的事情是个好主意,请用锤子砸你的手,以分散这种废话的注意力。
  • 我在这里练习了几件事。也使用 SQLServer 和 MySQL。那些日子我尝试使用 SQLServer 2008
  • 我也必须添加这个:不要这样做。只是不要。

标签: mysql sql sql-server tsql sql-server-2008-r2


【解决方案1】:

在我回答这个问题之前,我必须先说这是一个糟糕的主意请不要为每个病人创建一个新表。这会给你带来很多问题。

例如,如果您有 100 位患者,那么您将有 100 个表格。那么,如果您需要为每个患者返回数据,您会怎么做……您将一团糟。

如果您想在 SQL Server 中执行此类进程,可以通过以下方式执行此操作:

示例表

CREATE TABLE [dbo].[Test](
    [id] [int] NOT NULL,
    [name] [varchar](50) NOT NULL
) ON [PRIMARY]

Your Trigger 将使用动态 SQL 从插入的数据中检索名称。:

CREATE TRIGGER dbo.testTrg
   ON  dbo.test
   AFTER INSERT
AS 
BEGIN
    SET NOCOUNT ON;

    declare @newtable varchar(50)
    set @newtable = (select quotename(name) from inserted)

    declare @sql varchar(max)

    set @sql = 'create table ' + @newtable + '
        ( 
            [id] [int] NOT NULL, 
            [newColumn1] [varchar](50) NOT NULL
        ) ON [PRIMARY]' 

    exec(@sql)

END

此触发器将创建表:

CREATE TABLE [dbo].[test1](
    [id] [int] NOT NULL,
    [newColumn1] [varchar](50) NOT NULL
) ON [PRIMARY]

对于患者来说,更好的设计如下。拥有一张 Patient 表格,然后您将根据需要拥有其他表格,以包含该 Patient 的任何其他详细信息:

Patient Table:
id int, -- PK
name varchar(50)

Doctor Table
id int, -- PK
name varchar(50)

Patient_Doctor table
p_id int,  -- PK -- FK to Patient Table
d_id int  -- PK  -- FK to Doctor Table

【讨论】:

猜你喜欢
  • 2021-08-05
  • 2021-09-29
  • 2011-10-17
  • 1970-01-01
  • 2014-10-25
  • 2020-08-29
  • 2014-08-09
  • 1970-01-01
  • 2014-05-30
相关资源
最近更新 更多