2016-11-17 5 views
0

я создал 3 хранимые процедуры, которые будут:Есть ли лучший способ написать эту хранимую процедуру?

  1. создать новую таблицу дб
  2. Вставка данных во вновь созданную таблицу, вставить строку в таблицу журнала audit_log и обновление существующей строки в том же журнале audit_log таблица

Вот порядок, который я исполняю хранимые процедуры:

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 '[email protected] + '_' + 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] 
+0

IMO MKMG_Build_Appt_Table обеспечивает нулевое значение и только добавляет сложности и хрупкости. Возможно, чтобы имя таблицы получало функцию, но это все, что я сделал бы там. –

+2

Всякий раз, когда вы начинаете имена таблиц с такими вещами, как дата в них, это должен быть ОГРОМНЫЙ красный флаг, что-то очень неправильно. И эти таблицы downtime_appointments, похоже, имеют довольно серьезные проблемы с нормализацией. Кажется, у вас есть внешний ключ для таблицы человека, но тогда есть данные для человека в таблице встреч. даты как varchar, хранения возраста человека (это должно быть рассчитано) и т. д. –

+1

Тогда у вас есть проблема с первичными ключами. То, как у вас есть все ваши столы, будет кучей. И честно говоря, в чем смысл? В любом случае вы должны указать каждое имя столбца и тип данных. Почему бы просто написать инструкцию create table и не забыть процедуру для создания таблицы. Он имеет множество головных болей и широко открыт для инъекций sql. –

ответ

0
  1. Ваше моделирование разделов не является хорошей идеей.
  2. Если вы хотите сохранить исторические данные или изменения, вы должны использовать, например, триггер (с типом timestamp и dml).
  3. Если вы хотите создать таблицу с такой же структурой, самым простым способом это

    select top 0 * into newtable from oldtable 
    
  4. Используйте соответствующее свойство для столбцов таблицы (NULL против NOT NULL), ограничение и индексы. Дата как varchar в порядке (это формат даты ISO 8601), но нет, если его можно комбинировать со временем. Но дата как varchar (8) и время как char (4) - попытайтесь создать равномерно.
  5. Да, ваш код должен иметь обработку ошибок, особенно при использовании динамических операторов.
  6. Избегайте дублирования составления имен - оно должно быть в переменной.
Смежные вопросы