Mijn vraag
Voor een schoolopdracht moet ik een stored procedure schrijven die aangeroepen kan worden met één parameter (namelijk de tabelnaam). Deze stored procedure dient een create tabel statement te retourneren.
Ik moet middels de stored procedure een script genereren op basis van de Emp tabel om HIST_Emp aan te maken. Dit is echter een voorbeeld. In principe moet elke tabel die in het standaard schema (dbo) staat, gegenereerd kunnen worden. Onderstaand een voorbeeld van de output:
Het enige verschil tussen emp en hist_emp is de timestamp kolom die er bij komt en de primary key. De Emp tabel heeft alleen Empno als primary key.
Relevante software en hardware die ik gebruik
MSSQL server 2017
Wat ik al gevonden of geprobeerd heb
Ik heb al rondgegoogled maar kom op google alleen erg ingewikkelde scripts tegen, die ik niet begrijp. Als ik mijn script werkend krijg, ben ik volgens mij al een heel eind en daarom wil ik eigenlijk geen scripts van internet halen.
het probleem is dat deze achter de laatste "NOT NULL' ook een komma zet. Dat wil ik niet, want dat is foutieve syntax. Kan ik dat er gewoon afknippen met LEFT() of zou dit op een elegantere manier kunnen?
Voor een schoolopdracht moet ik een stored procedure schrijven die aangeroepen kan worden met één parameter (namelijk de tabelnaam). Deze stored procedure dient een create tabel statement te retourneren.
SQL:
1
2
| --aanroepen van de stored procedure EXEC SP_GENERATE_CREATE_TABLE_SCRIPT 'EMP' |
Ik moet middels de stored procedure een script genereren op basis van de Emp tabel om HIST_Emp aan te maken. Dit is echter een voorbeeld. In principe moet elke tabel die in het standaard schema (dbo) staat, gegenereerd kunnen worden. Onderstaand een voorbeeld van de output:
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| CREATE TABLE [HIST_EMP]( [EMPNO] [NUMERIC](4, 0) NOT NULL, [TIMESTAMP] [TIMESTAMP] NOT NULL, [ENAME] [VARCHAR](8) NOT NULL, [JOB] [VARCHAR](9) NOT NULL, [BORN] [DATE] NOT NULL, [HIRED] [DATE] NOT NULL, [SGRADE] [NUMERIC](2, 0) NOT NULL, [MSAL] [NUMERIC](7, 2) NOT NULL, [USERNAME] [VARCHAR](15) NOT NULL, [DEPTNO] [NUMERIC](2, 0) NOT NULL CONSTRAINT [HIST_EMP_PK ] PRIMARY KEY(EMPNO, TIMESTAMP) |
Het enige verschil tussen emp en hist_emp is de timestamp kolom die er bij komt en de primary key. De Emp tabel heeft alleen Empno als primary key.
Relevante software en hardware die ik gebruik
MSSQL server 2017
Wat ik al gevonden of geprobeerd heb
Ik heb al rondgegoogled maar kom op google alleen erg ingewikkelde scripts tegen, die ik niet begrijp. Als ik mijn script werkend krijg, ben ik volgens mij al een heel eind en daarom wil ik eigenlijk geen scripts van internet halen.
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
| DECLARE @TABEL_NAAM VARCHAR(MAX) = 'EMP' DECLARE @Q VARCHAR(MAX) = ''; SELECT @Q += ISC.COLUMN_NAME + ' ' + ISC.DATA_TYPE + CASE DATA_TYPE WHEN 'NUMERIC' THEN '(' + CONVERT(VARCHAR(MAX), NUMERIC_PRECISION) + ',' + CONVERT(VARCHAR(MAX),NUMERIC_SCALE) + ') ' WHEN 'VARCHAR' THEN '(' + CONVERT(VARCHAR(MAX), CHARACTER_MAXIMUM_LENGTH) + ')' ELSE '' END + ' ' + CASE IS_NULLABLE WHEN 'NO' THEN 'NOT NULL, ' ELSE 'NULL, ' END FROM INFORMATION_SCHEMA.COLUMNS ISC WHERE ISC.TABLE_NAME = @TABEL_NAAM SELECT 'CREATE TABLE HIST_' + 'EMP' + ' ( ' +@q + ' )' + 'CONSTRAINT HIST_' + 'EMP' + '_PK' + COLUMN_NAME FROM INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE ISCCU INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS ISTC ON ISCCU.CONSTRAINT_NAME = ISTC.CONSTRAINT_NAME WHERE ISCCU.TABLE_NAME = 'EMP' AND CONSTRAINT_TYPE = 'PRIMARY KEY' |
het probleem is dat deze achter de laatste "NOT NULL' ook een komma zet. Dat wil ik niet, want dat is foutieve syntax. Kan ik dat er gewoon afknippen met LEFT() of zou dit op een elegantere manier kunnen?
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
| CREATE TABLE HIST_EMP ( empno numeric(4,0) NOT NULL, ename varchar(8) NOT NULL, job varchar(9) NOT NULL, born date NOT NULL, hired date NOT NULL, sgrade numeric(2,0) NOT NULL, msal numeric(7,2) NOT NULL, username varchar(15) NOT NULL, deptno numeric(2,0) NOT NULL, CONSTRAINT HIST_EMP_PK PRIMARY key (empno) ) |