Skip to content

Commit b41736e

Browse files
authored
Merge pull request #32 from IPdotSetAF/30-mssql-scaffolder-sp-params-nullable
fixed sp aprameters nullable
2 parents b7c3b14 + df5701e commit b41736e

File tree

3 files changed

+48
-17
lines changed

3 files changed

+48
-17
lines changed

Frontend/src/app/mssql-scaffolder/mssql-scaffolder.component.ts

Lines changed: 30 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,9 @@ import { AppComponent } from '../app/app.component';
77
import { ConnectRequest, ConnectResponse, ErrorResponse, GetAllDatabasesResponse, GetAllSchemasResponse, GetStoredProceduresResponse, GetTablesResponse } from '../../services/mssql/mssql.model';
88
import { MssqlScaffolderService } from './mssql-scaffolder.service';
99
import { Meta } from '@angular/platform-browser';
10-
import { GetColumnsResponse, GetSPParametersResponse, GetSPReturnColumnsResponse } from './mssql-scaffolder.model';
10+
import { GetColumnsResponse, GetSPReturnColumnsResponse, SPDefinition, SPParam } from './mssql-scaffolder.model';
1111
import { RouterLink } from '@angular/router';
12+
import { forkJoin } from 'rxjs';
1213

1314
@Component({
1415
selector: 'app-mssql-scaffolder',
@@ -216,24 +217,38 @@ ${res.map((p) => `\tpublic ${MssqlScaffolderComponent.convertDataType(p.DataType
216217

217218
private scaffoldSP() {
218219
const sc = this.scaffoldForm.getRawValue();
219-
this.scaffolder.getSPParameters(this.connectionID, sc.database, sc.schema, sc.sp).subscribe(ps => {
220-
ps = ps as GetSPParametersResponse[];
221-
this.scaffolder.getSPReturnColumns(this.connectionID, sc.database, sc.schema, sc.sp).subscribe(rs => {
222-
rs = rs as GetSPReturnColumnsResponse[];
223-
224-
const psc = ps.map((p) => `\tpublic ${MssqlScaffolderComponent.convertDataType(p.Type)}${p.Nullable ? '?' : ''} ${p.Parameter_name} { get; set; }`);
225-
const rsc = rs.map((p) => `\tpublic ${MssqlScaffolderComponent.convertDataType(p.system_type_name)}${p.Nullable ? '?' : ''} ${p.column} { get; set; }`);
226220

227-
this.csCode =
228-
`${psc.length > 0 ? `public class ${sc.sp}Params {`:'' }
221+
forkJoin({
222+
params: this.scaffolder.getSPDefinition(this.connectionID, sc.database, sc.schema, sc.sp),
223+
result: this.scaffolder.getSPReturnColumns(this.connectionID, sc.database, sc.schema, sc.sp)
224+
}).subscribe(vals => {
225+
const spDef = (vals.params as SPDefinition[])[0].definition;
226+
const spUpper = spDef.toUpperCase();
227+
228+
const ps = [...(spDef.substring(spUpper.indexOf("CREATE PROCEDURE"), spUpper.indexOf("AS"))
229+
.matchAll(/@(?<name>\w+) +(?<type>\w+(\(.*\)){0,1}) *=* *(?<nul>(NULL){0,1})/gmi))].map(match => {
230+
if (match.groups)
231+
return {
232+
Parameter_name: match.groups['name'],
233+
Type: match.groups['type'],
234+
Nullable: match.groups['nul'] && match.groups['nul'].length > 0 ? true : false
235+
} as SPParam;
236+
return undefined;
237+
}).filter(v => v) as SPParam[];
238+
const rs = vals.result as GetSPReturnColumnsResponse[];
239+
240+
const psc = ps.map((p) => `\tpublic ${MssqlScaffolderComponent.convertDataType(p.Type)}${p.Nullable ? '?' : ''} ${p.Parameter_name} { get; set; }`);
241+
const rsc = rs.map((p) => `\tpublic ${MssqlScaffolderComponent.convertDataType(p.system_type_name)}${p.Nullable ? '?' : ''} ${p.column} { get; set; }`);
242+
243+
this.csCode =
244+
`${psc.length > 0 ? `public class ${sc.sp}Params {` : ''}
229245
${psc.join("\n")}
230-
${psc.length > 0 ? '}':'' }
246+
${psc.length > 0 ? '}' : ''}
231247
232-
${rsc.length>0? `public class ${sc.sp}Result {`:'' }
248+
${rsc.length > 0 ? `public class ${sc.sp}Result {` : ''}
233249
${rsc.join("\n")}
234-
${rsc.length > 0 ? '}':'' }`;
235-
this.codeFlip = !this.codeFlip;
236-
});
250+
${rsc.length > 0 ? '}' : ''}`;
251+
this.codeFlip = !this.codeFlip;
237252
});
238253
}
239254

Frontend/src/app/mssql-scaffolder/mssql-scaffolder.model.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,14 @@ export interface GetColumnsResponse {
2323
column: string;
2424
system_type_name: string;
2525
Nullable: boolean;
26+
}
27+
28+
export interface SPDefinition{
29+
definition: string;
30+
}
31+
32+
export interface SPParam{
33+
Parameter_name: string;
34+
Type: string;
35+
Nullable: boolean;
2636
}

Frontend/src/app/mssql-scaffolder/mssql-scaffolder.service.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { Injectable } from '@angular/core';
22
import { MssqlService } from '../../services/mssql/mssql.service';
33
import { map, Observable } from 'rxjs';
4-
import { GetColumnsResponse, GetSPParametersResponse, GetSPReturnColumnsResponse } from './mssql-scaffolder.model';
4+
import { GetColumnsResponse, GetSPParametersResponse, GetSPReturnColumnsResponse, SPDefinition } from './mssql-scaffolder.model';
55
import { ErrorResponse } from '../../services/mssql/mssql.model';
66

77
@Injectable({
@@ -60,7 +60,13 @@ export class MssqlScaffolderService {
6060
);
6161
}
6262

63-
// 7. Get all return columns and their types from an SP
63+
// 7. Get SP definition lines
64+
getSPDefinition(connection_id: string, dbName: string, schemaName: string, spName: string): Observable<SPDefinition[] | ErrorResponse>{
65+
const query = `SELECT object_definition(object_id('${schemaName}.${spName}')) AS definition;`;
66+
return this.mssql.executeQuery<SPDefinition>(connection_id, query, dbName);
67+
}
68+
69+
// 8. Get all return columns and their types from an SP
6470
getSPReturnColumns(connection_id: string, dbName: string, schemaName: string, spName: string): Observable<GetSPReturnColumnsResponse[] | ErrorResponse> {
6571
const query = `
6672
SELECT name AS 'column', system_type_name, is_nullable as 'Nullable'

0 commit comments

Comments
 (0)