| | 220 | |
| | 221 | = Пополнување на табели |
| | 222 | |
| | 223 | Податоците ги увезуваме од CSV датотеки преку staging табели, со цел: |
| | 224 | * да се овозможи контрола и чистење на податоците |
| | 225 | * да се избегнат грешки при директен внес на финалните табели |
| | 226 | * да се овозможи безбедно кастирање на типови (dates, decimals, uniqueidentifier) |
| | 227 | |
| | 228 | == Staging табели |
| | 229 | |
| | 230 | За секоја финална табела е креирана соодветна staging табела. Во овие табели сите колони се дефинирани како `VARCHAR`, со што: |
| | 231 | * се избегнуваат грешки при `BULK INSERT` |
| | 232 | * се овозможува чистење на податоци (отстранување на наводници) |
| | 233 | * се користи `TRY_CAST` за безбедна конверзија кон финалните типови. |
| | 234 | |
| | 235 | Staging табели: |
| | 236 | * `patients_staging` |
| | 237 | * `encounters_staging` |
| | 238 | * `conditions_staging` |
| | 239 | * `observations_staging` |
| | 240 | * `medications_staging` |
| | 241 | * `allergies_staging` |
| | 242 | * `procedures_staging` |
| | 243 | * `immunizations_staging` |
| | 244 | |
| | 245 | == Процес на увоз на податоци |
| | 246 | |
| | 247 | Процесот на пополнување за секоја табела се состои од следните чекори: |
| | 248 | 1. Празнење на staging табелата (truncate). |
| | 249 | 2. `BULK INSERT` од CSV датотека |
| | 250 | 3. Проверка на број на редови во staging табелата |
| | 251 | 4. `INSERT` во финалната табела со `CAST` / `TRY_CAST` |
| | 252 | 5. Проверка на број на редови во финалната табела. |
| | 253 | |
| | 254 | === Пример: Пополнување на табелата Patients |
| | 255 | |
| | 256 | Податоците за пациенти се увезуваат од датотеката `patients.csv`. |
| | 257 | При увозот: |
| | 258 | * `ID` полињата се конвертираат во `UNIQUEIDENTIFIER` |
| | 259 | * датумите се конвертираат во `DATE` |
| | 260 | * нумеричките вредности се конвертираат во `DECIMAL` |
| | 261 | * се користи `TRY_CAST` за справување со недостасувачки вредности |
| | 262 | |
| | 263 | {{{#!sql |
| | 264 | use HospitalSyntheaDB; |
| | 265 | go |
| | 266 | |
| | 267 | if object_id('dbo.patients_staging') is not null drop table dbo.patients_staging; |
| | 268 | go |
| | 269 | |
| | 270 | create table patients_staging( |
| | 271 | id varchar(100), birthdate varchar(50), deathdate varchar(50), ssn varchar(50), drivers varchar(50), |
| | 272 | passport varchar(50), prefix varchar(50), first varchar(100), middle varchar(100), last varchar(100), |
| | 273 | suffix varchar(50), maiden varchar(100), marital varchar(50), race varchar(50), ethnicity varchar(50), |
| | 274 | gender varchar(10), birthplace varchar(200), address varchar(200), city varchar(100), state varchar(50), |
| | 275 | county varchar(100), fips varchar(20), zip varchar(20), lat varchar(20), lon varchar(20), |
| | 276 | healthcare_expenses varchar(50), healthcare_coverage varchar(50), income varchar(50) |
| | 277 | ); |
| | 278 | go |
| | 279 | |
| | 280 | truncate patients_staging; |
| | 281 | bulk insert patients_staging |
| | 282 | from 'C:\Users\user\Documents\DBA\synthea\output\csv\patients.csv' |
| | 283 | with (fieldterminator = ',', rowterminator = '\n', firstrow = 2, codepage = '65001', tablock); |
| | 284 | go |
| | 285 | |
| | 286 | print 'Patients staging row count:'; |
| | 287 | select count(*) as patients_staging_count from patients_staging; |
| | 288 | go |
| | 289 | |
| | 290 | insert into patients |
| | 291 | select |
| | 292 | cast(replace(id,'"','') as uniqueidentifier), |
| | 293 | cast(replace(birthdate,'"','') as date), |
| | 294 | try_cast(replace(deathdate,'"','') as date), |
| | 295 | replace(ssn,'"',''), |
| | 296 | replace(drivers,'"',''), |
| | 297 | replace(passport,'"',''), |
| | 298 | replace(prefix,'"',''), |
| | 299 | replace(first,'"',''), |
| | 300 | replace(middle,'"',''), |
| | 301 | replace(last,'"',''), |
| | 302 | replace(suffix,'"',''), |
| | 303 | replace(maiden,'"',''), |
| | 304 | replace(marital,'"',''), |
| | 305 | replace(race,'"',''), |
| | 306 | replace(ethnicity,'"',''), |
| | 307 | upper(replace(gender,'"','')), |
| | 308 | replace(birthplace,'"',''), |
| | 309 | replace(address,'"',''), |
| | 310 | replace(city,'"',''), |
| | 311 | replace(state,'"',''), |
| | 312 | replace(county,'"',''), |
| | 313 | replace(fips,'"',''), |
| | 314 | replace(zip,'"',''), |
| | 315 | try_cast(replace(lat,'"','') as decimal(9,6)), |
| | 316 | try_cast(replace(lon,'"','') as decimal(9,6)), |
| | 317 | try_cast(replace(healthcare_expenses,'"','') as decimal(18,2)), |
| | 318 | try_cast(replace(healthcare_coverage,'"','') as decimal(18,2)), |
| | 319 | try_cast(replace(income,'"','') as decimal(18,2)) |
| | 320 | from patients_staging; |
| | 321 | go |
| | 322 | |
| | 323 | print 'Patients final row count:'; |
| | 324 | select count(*) as patients_count from patients; |
| | 325 | go |
| | 326 | }}} |
| | 327 | |
| | 328 | == Чистење по увоз |
| | 329 | |
| | 330 | По успешниот увоз на податоци, staging табелите е бришат. |
| | 331 | |
| | 332 | Ова спречува непотребно користење простор и ја задржува базата чиста за понатамошни фази од проектот. |
| | 333 | |
| | 334 | {{{#!sql |
| | 335 | drop table patients_staging; |
| | 336 | go |
| | 337 | }}} |