Jednym z wymagań dotyczących projektu było rozszerzenie istniejącej tablicy ’employee’ o jedną komunę: salary. Każdy istniejący rekord musi posiadać pewną wartość w nowej kolumnie. Został podesłany plik csv w którym zapisane były informacje z wartościami do nowej kolumny. Po stronie klienta można tylko odpalić wcześniej przygotowany skrypt. Skrypt powinien na początku stworzyć kopię aktualnej tabeli, a później wpisać wartości do nowej kolumny.
Na początku tabela ’employee’ po stronie klienta wygląda tak:
id | name | surname | PESEL |
---|---|---|---|
1 | Jan | Kowalski | 28092418406 |
2 | Zbigniew | Kręcina | 47101816477 |
3 | John | Smith | 55020101734 |
4 | Albert | Nowak | 21060309285 |
Plik dostarczony przez klienta:
name,surname,PESEL,salary
Jan,Kowalski,28092418406,5000
Zbigniew,Kr©cina,47101816477,2500
John,Smith,55020101734,4100
Albert,Nowak,21060309285,1800
Jak można rozwiązać ten problem?
- Stworzyć kopię tabeli
- Stworzyć tabelę w pamięci z dwoma kolumnami: PESEL oraz salary
- Uzupełnić tą tabelę tymczasową danymi
- Dodać do aktualnej tabelę nową kolumnę
- Uzupełnić tabelę ’employee’ nowymi danymi.
Rozwiązanie:
- Kopia będzie zapisana z informacją o aktualnej dacie i godzinie.
DECLARE @currentDataAndHour CHAR(12) SELECT @currentDataAndHour = CONVERT(VARCHAR(24),GETDATE(),112) + CONVERT(varchar(2), DATEPART(hh,GETDATE())) + CONVERT(varchar(2),DATEPART(mi,GETDATE())) DECLARE @nameOfBackupTable VARCHAR(100) SELECT @nameOfBackupTable = 'employee_Backup_' + @currentDataAndHour DECLARE @sSQL VARCHAR(max) SET @sSQL = 'SELECT * INTO ' + @nameOfBackupTable + ' FROM employee' PRINT @sSQL EXEC (@sSQL)
- Dzięki numerowi PESEL będę rozpoznawać zatrudnioną osobę + oczywiście wypłata.
DECLARE @tempTable TABLE( [PESEL] [CHAR](11) NOT NULL, [Salary] [INT] NOT NULL )
- Załóżmy, że importowanie plików w SQL Managment Studio nie działa :). Wchodzę do Excel, usuwam niepotrzebne kolumn i zapisuję plik w csv:
PESEL,salary
28092418406,5000
47101816477,2500
55020101734,4100
21060309285,1800Następnie na stronie http://www.convertcsv.com/csv-to-sql.htm. Wrzucam plik z csv, wybieram opcję:
INSERT INTO @tempTable(PESEL,salary) VALUES (28092418406,5000); INSERT INTO @tempTable(PESEL,salary) VALUES (47101816477,2500); INSERT INTO @tempTable(PESEL,salary) VALUES (55020101734,4100); INSERT INTO @tempTable(PESEL,salary) VALUES (21060309285,1800);
- Dodanie nowej kolumny do istniejącej tabeli:
ALTER TABLE employee ADD salary [INT]
- Sprawdzam czy PESEL jest taki sam. Jeżeli tak do podmieniam wypłatę.
UPDATE [Warehouse].[dbo].[employee] SET salary = temp.salary FROM employee empl LEFT JOIN @tempTable temp ON empl.PESEL = temp.PESEL
Całość prezentuje się tak:
DECLARE @currentDataAndHour CHAR(12) SELECT @currentDataAndHour = CONVERT(VARCHAR(24),GETDATE(),112) + CONVERT(varchar(2), DATEPART(hh,GETDATE())) + CONVERT(varchar(2),DATEPART(mi,GETDATE())) DECLARE @nameOfBackupTable VARCHAR(100) SELECT @nameOfBackupTable = 'employee_Backup_' + @currentDataAndHour DECLARE @sSQL VARCHAR(max) SET @sSQL = 'SELECT * INTO ' + @nameOfBackupTable + ' FROM employee' PRINT @sSQL EXEC (@sSQL) DECLARE @tempTable TABLE( [PESEL] [CHAR](11) NOT NULL, [Salary] [INT] NOT NULL ) INSERT INTO @tempTable(PESEL,salary) VALUES (28092418406,5000); INSERT INTO @tempTable(PESEL,salary) VALUES (47101816477,2500); INSERT INTO @tempTable(PESEL,salary) VALUES (55020101734,4100); INSERT INTO @tempTable(PESEL,salary) VALUES (21060309285,1800); ALTER TABLE [Warehouse].[dbo].[employee] ADD salary [INT] UPDATE [Warehouse].[dbo].[employee] SET PESEL = temp.PESEL FROM employee empl LEFT JOIN @tempTable temp ON empl.PESEL = temp.PESEL
id | name | surname | PESEL | salary |
---|---|---|---|---|
1 | Jan | Kowalski | 28092418406 | 5000 |
2 | Zbigniew | Kręcina | 47101816477 | 2500 |
3 | John | Smith | 55020101734 | 4100 |
4 | Albert | Nowak | 21060309285 | 1800 |