有没有更好的方法来编写这个存储过程?

时间:2016-11-17 19:33:13

标签: sql-server tsql

我创建了3个存储过程:

  1. 创建新的数据库表
  2. 将数据插入新创建的表中,在日志audit_log表中插入一行并更新同一日志audit_log表中的现有行
  3. 以下是我执行存储过程的顺序:

    EXEC MKMG_Build_Appt_Table_Daily

    EXEC MKMG_Build_Appt_Table_Daily_Insert

    一切都没有任何问题,但有没有更好的方法来实现这一目标?如果是这样,您能否提供任何建议和帮助 是否应该添加任何错误处理?

    --Procedure 1
    CREATE PROCEDURE [dbo].[MKMG_Build_Appt_Table] 
    @TableName NVARCHAR(128)
    ,@Column1Name NVARCHAR(128)         ,@Column1DataType NVARCHAR(128)
    ,@Column2Name NVARCHAR(128)         ,@Column2DataType NVARCHAR(128)
    ,@Column3Name NVARCHAR(128)         ,@Column3DataType NVARCHAR(128)
    ,@Column4Name NVARCHAR(128)         ,@Column4DataType NVARCHAR(128)
    ,@Column5Name NVARCHAR(128)         ,@Column5DataType NVARCHAR(128)
    ,@Column6Name NVARCHAR(128)         ,@Column6DataType NVARCHAR(128)
    ,@Column7Name NVARCHAR(128)         ,@Column7DataType NVARCHAR(128)
    ,@Column8Name NVARCHAR(128)         ,@Column8DataType NVARCHAR(128)
    ,@Column9Name NVARCHAR(128)         ,@Column9DataType NVARCHAR(128)
    ,@Column10Name NVARCHAR(128)            ,@Column10DataType NVARCHAR(128)
    ,@Column11Name NVARCHAR(128)            ,@Column11DataType NVARCHAR(128)
    ,@Column12Name NVARCHAR(128)            ,@Column12DataType NVARCHAR(128)
    ,@Column13Name NVARCHAR(128)            ,@Column13DataType NVARCHAR(128)
    ,@Column14Name NVARCHAR(128)            ,@Column14DataType NVARCHAR(128)
    ,@Column15Name NVARCHAR(128)            ,@Column15DataType NVARCHAR(128)
    ,@Column16Name NVARCHAR(128)            ,@Column16DataType NVARCHAR(128)
    ,@Column17Name NVARCHAR(128)            ,@Column17DataType NVARCHAR(128) 
    ,@Column18Name NVARCHAR(128)            ,@Column18DataType NVARCHAR(128) 
    
    AS
    
       DECLARE @SQLString  NVARCHAR(MAX)
     SET @SQLString = 'CREATE TABLE '+@TableName + '_' + CONVERT(VARCHAR,GETDATE(),112) + '_' + CONVERT(VARCHAR,DATEADD(dd, 1, GETDATE()),112) + 
    
        '( '    + @Column1Name + ' '+ @Column1DataType + ','
                + @Column2Name + ' '+ @Column2DataType + ','
                + @Column3Name + ' '+ @Column3DataType + ','
                + @Column4Name + ' '+ @Column4DataType + ','
                + @Column5Name + ' '+ @Column5DataType + ','
                + @Column6Name + ' '+ @Column6DataType + ','
                + @Column7Name + ' '+ @Column7DataType + ','
                + @Column8Name + ' '+ @Column8DataType + ','
                + @Column9Name + ' '+ @Column9DataType + ','
                + @Column10Name + ' '+ @Column10DataType + ','
                + @Column11Name + ' '+ @Column11DataType + ','
                + @Column12Name + ' '+ @Column12DataType + ','
                + @Column13Name + ' '+ @Column13DataType + ','
                + @Column14Name + ' '+ @Column14DataType + ','
                + @Column15Name + ' '+ @Column15DataType + ','
                + @Column16Name + ' '+ @Column16DataType + ','
                + @Column17Name + ' '+ @Column17DataType + ','
                + @Column18Name + ' '+ @Column18DataType
        + ')'
    
    
        EXEC (@SQLString)
    
    
    --Procedure 2
    
     CREATE PROCEDURE [dbo].[MKMG_Build_Appt_Table_Daily]
     AS
    
     EXEC MKMG_Build_Appt_Table 'downtime_appointments',
                                'person_id',        'uniqueidentifier',
                                'location_name',    'varchar(40)',
                                'appt_date',        'varchar(8)',
                                'begintime',        'char(4)',
                                'MRN',              'varchar(15)',
                                'patient',          'varchar(120)',
                                'age_years',        'varchar(3)',
                                'date_of_birth',    'varchar(8)',
                                'sex',              'char(1)',
                                'ethnicity',        'varchar(40)',
                                'language',         'varchar(100)',
                                'home_phone',       'varchar(10)',
                                'day_phone',        'varchar(20)',
                                'provider',         'varchar(75)',
                                'specialty',        'varchar(40)',
                                'event',            'varchar(30)',
                                'appt_type',        'char(1)',
                                'file_location',    'varchar(200)'
    
    
     --Procedure 3
    
    
     CREATE PROCEDURE [dbo].[MKMG_Build_Appt_Table_Daily_Insert]
    
     AS
    
        DECLARE @SQLString2 NVARCHAR(MAX)
    
        SET @SQLString2 =   'INSERT INTO MUReports..downtime_appointments'+ '_' + CONVERT(VARCHAR,GETDATE(),112) + '_' + CONVERT(VARCHAR,DATEADD(dd, 1, GETDATE()),112) + ' ' +
                        'SELECT * FROM MUReports..downtime_appointments'
    
        EXEC (@SQLString2)
    
    
        INSERT INTO MUReports..downtime_appointments_audit_log 
        VALUES('downtime_appointments'+ '_' + CONVERT(VARCHAR,GETDATE(),112)      + '_' + CONVERT(VARCHAR,DATEADD(dd, 1, GETDATE()),112), 'Y', GETDATE()) 
    
        UPDATE MUReports..downtime_appointments_audit_log SET status = 'N' 
        WHERE appt_table_name = 'downtime_appointments' + '_' + CONVERT(VARCHAR,DATEADD(dd, -1, GETDATE()),112) + '_' + CONVERT(VARCHAR,GETDATE(),112)
    
    
    
     --Audit_log
    
     CREATE TABLE downtime_appointments_audit_log (
     appt_table_name        VARCHAR(100),
     status             VARCHAR(1),
     time_stamp         DATETIME
     )
    
    
    
    
     --downtime_appointments table
    
    
     CREATE TABLE [dbo].[downtime_appointments](
    [person_id] [uniqueidentifier] NULL,
    [location_name] [varchar](40) NULL,
    [appt_date] [varchar](8) NULL,
    [begintime] [char](4) NULL,
    [MRN] [varchar](15) NULL,
    [patient] [varchar](120) NULL,
    [age_years] [varchar](3) NULL,
    [date_of_birth] [varchar](8) NULL,
    [sex] [char](1) NULL,
    [ethnicity] [varchar](40) NULL,
    [language] [varchar](100) NULL,
    [home_phone] [varchar](10) NULL,
    [day_phone] [varchar](10) NULL,
    [provider] [varchar](75) NULL,
    [specialty] [varchar](40) NULL,
    [event] [varchar](30) NULL,
    [appt_type] [char](1) NULL,
    [file_location] [varchar](200) NULL
     ) ON [PRIMARY]
    

1 个答案:

答案 0 :(得分:0)

  1. 您对分区的模拟并不是一个好主意。
  2. 如果您希望存储历史数据或更改,则应使用例如trigger(带时间戳和dml类型)。
  3. 如果您想创建具有相同结构的表,最简单的方法是

    select top 0 * into newtable from oldtable
    
  4. 对表列(NULL与NOT NULL),约束和索引使用适当的属性。 varchar的日期是好的(它是ISO 8601日期格式),但是如果它可以与时间组合则不。但是日期为varchar(8),时间为char(4) - 尝试统一设计。
  5. 是的,您的代码应该有错误处理,特别是当您使用动态语句时。
  6. 避免重复撰写名称 - 它应该是变量。