2016-11-17 7 views
0

erstellt I 3 gespeicherten Prozeduren, die:Gibt es eine bessere Möglichkeit, diese gespeicherte Prozedur zu schreiben?

  1. eine neue Tabelle db
  2. Einfügen von Daten in die neu erstellte Tabelle erstellen, eine Zeile in eine Protokoll audit_log Tabelle einfügen und eine vorhandene Zeile in dem gleichen Protokoll audit_log aktualisieren
  3. Tisch

Hier ist die Reihenfolge, dass ich die gespeicherten Prozeduren auszuführen:

EXEC MKMG_Build_Appt_Table_Daily

EXEC MKMG_Build_Appt_Table_Daily_Insert

Alles funktioniert ohne Probleme, aber gibt es einen besseren Weg, dies zu erreichen? Wenn ja, können Sie mit irgendwelchen Vorschlägen helfen und sollte irgendeine Fehlerbehandlung hinzugefügt werden?

--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 bietet null Wert und fügt nur Komplexität und Fragilität hinzu. Vielleicht sollte der Tabellenname eine Funktion bekommen, aber das ist alles, was ich dort tun würde. –

+2

Immer wenn Sie beginnen, Tabellen mit Dingen wie dem Datum in ihnen zu benennen, sollte es eine riesige rote Flagge sein, dass etwas sehr falsch ist. Und diese "downtime_appointments" -Tabellen scheinen ziemlich ernsthafte Normalisierungsprobleme zu haben. Sie scheinen einen Fremdschlüssel für eine Personentabelle zu haben, aber dann gibt es Daten für eine Person in der Termintabelle. Datumsangaben als Varchar, Speichern des Alters einer Person (dies sollte berechnet werden) usw. –

+1

Dann haben Sie das Problem der Primärschlüssel. Die Art, wie du all diese Tische hast, wird haufenweise sein. Und ehrlich, was ist der Sinn? Sie müssen jeden Spaltennamen und jeden Datentyp angeben. Warum schreiben Sie nicht einfach eine create table-Anweisung und vergessen Sie eine Prozedur zum Erstellen einer Tabelle. Es hat viele Kopfschmerzen und ist weit offen für SQL-Injektion. –

Antwort

0
  1. Ihre Simulation der Partitionierung ist nicht gute Idee.
  2. Wenn Sie historische Daten oder Änderungen speichern möchten, sollten Sie zum Beispiel Trigger (mit Zeitstempel und dml-Typ) verwenden.
  3. Wenn Sie Tabelle der einfachste Weg, mit der gleichen Struktur erstellen möchte, ist

    select top 0 * into newtable from oldtable 
    
  4. Verwenden Sie geeignete Eigenschaft für Tabellenspalten (NULL vs NOT NULL), Einschränkungen und Indizes. Datum als Varchar ist in Ordnung (es ist ISO 8601 Datumsformat), aber nein, wenn es mit der Zeit kombiniert werden könnte. Aber date als varchar (8) und time as char (4) - versuche einheitlich zu gestalten.
  5. Ja, Ihr Code sollte Fehlerbehandlung haben, besonders wenn Sie dynamische Anweisungen verwenden.
  6. Vermeiden Sie doppelte Zusammensetzung von Namen - es sollte in Variable sein.
Verwandte Themen