csvtosql_core/
sql_builder.rs

1pub fn build_sql_statement(headers: Vec<String>, table: &str, database: &str) -> String{
2    let mut columns: Vec<String> = Vec::with_capacity(headers.len()+2);
3    columns.push("[RowID] [int] IDENTITY(1,1) NOT NULL".to_string());
4
5    for header in headers {
6        let trimmed_header: String = header.chars().filter(|c| !c.is_whitespace()).collect();
7        if trimmed_header.ends_with("Dt") || trimmed_header.ends_with("Date"){
8            columns.push(format!("[{}] [date] NULL", trimmed_header));
9        } else if trimmed_header.contains("Amt") || trimmed_header.contains("Amount"){
10            columns.push(format!("[{}] [numeric](18,2) NULL", trimmed_header))
11        }else{
12            columns.push(format!("[{}] [varchar](50) NULL", trimmed_header))
13        }
14    }
15    columns.push("[CreateDate] [date] NOT NULL".to_string());
16
17    let result: String = format!(r#"USE [{db}]
18GO
19
20IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA='dbo' AND TABLE_NAME = '{table_name}')
21BEGIN
22CREATE TABLE [dbo].[{table_name}]
23{cols}
24CONSTRAINT [PK_{table_name}] PRIMARY KEY CLUSTERED(
25[RowID] ASC
26)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
27) ON [PRIMARY]
28ALTER TABLE [dbo].[{table_name}] ADD CONSTRAINT [DF_{table_name}_CreateDate] DEFAULT (getdate()) FOR [CreateDate]
29END
30GO"#, db = database, table_name = table, cols = columns.join(",\n"));
31
32    result
33}