0
我在3個存儲過程將:有沒有更好的方法來編寫這個存儲過程?
- 在相同的日誌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]
IMO MKMG_Build_Appt_Table提供了零值,只增加了複雜性和脆弱性。也許讓表名稱獲得一個函數,但那只是我會在那裏做的。 –
每當你開始用諸如日期之類的東西來命名錶時,它應該是一個巨大的紅旗,表示某件事情是非常錯誤的。那downtime_appointments表似乎有非常嚴重的規範化問題。您似乎有一個人員表的外鍵,但在約會表中有一個人的數據。日期爲varchar,存儲一個人的年齡(這應該被計算)等等。 –
然後你有主鍵的問題。你有這種方式你的桌子將是堆。說實話,這有什麼意義?無論如何,您必須提供每個列名稱和數據類型。爲什麼不寫一個create table語句,而忘記創建一個表的過程。它有很多令人頭疼的問題,並且對sql注入開放。 –