2016-11-17 111 views
0

我在3個存儲過程將:有沒有更好的方法來編寫這個存儲過程?

  1. 在相同的日誌AUDIT_LOG創建一個新的數據庫表
  2. 將數據插入新創建的表,插入一行到一個日誌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. 如果您希望存儲歷史數據或更改,您應該使用例如觸發器(帶時間戳和dml類型)。
  3. 如果你想創建一個具有相同結構表的最簡單的方法是

    select top 0 * into newtable from oldtable 
    
  4. 使用表列相應的屬性(NULL VS NOT NULL),約束和索引。日期作爲varchar是可以的(它是ISO 8601日期格式),但是如果它可以與時間結合,則不能。但日期爲varchar(8)和時間爲char(4) - 嘗試統一設計。
  5. 是的,你的代碼應該有錯誤處理,特別是當你使用動態語句時。
  6. 避免名稱的重複組合 - 它應該在變量中。
相關問題