TableName PhysicalTableName PrimaryKey ForeignKey ForeignKey FieldName PhysicalFieldName DATATYPE LENGTH
Owner Table OWNER X Lease ID API14 *Owner ID *OWNR_ID VARCHAR 50
Owner Table OWNER Owner ID Lease ID API14 **Lease ID List **LSE_ID_LIST VARCHAR 50
Owner Table OWNER Owner ID Lease ID API14 **API14 List **API14_LIST VARCHAR 50
Owner Table OWNER Lease Count LSE_CNT VARCHAR 50
TableName PhysicalTableName PrimaryKey ForeignKey ForeignKey FieldName PhysicalFieldName DATATYPE LENGTH
Owner Table OWNER X Lease ID API14 *Owner ID OWNR_ID VARCHAR 50
Owner Table OWNER Owner ID Lease ID API14 **Lease ID List **LSE_ID_LIST VARCHAR 50
Owner Table OWNER Owner ID Lease ID API14 **API14 List **API14_LIST VARCHAR 50
Owner Table OWNER Lease Count LSE_CNT VARCHAR 50
CREATE TABLE OWNER (
OWNR_ID varchar(50),
LSE_ID_LIST varchar(50),
API14_LIST varchar(50),
...
)
/* Create control tables to hold imported data dictionary data. */
CREATE TABLE dbo.tables
(
TableId int IDENTITY(1, 1) NOT NULL CONSTRAINT tables__PK PRIMARY KEY,
TableName varchar(100) NULL,
PhysicalTableName varchar(100) NOT NULL,
SchemaName varchar(30) NOT NULL CONSTRAINT tables__DF_SchemaName DEFAULT 'dbo',
PrimaryKeyCount tinyint NULL
);
CREATE TABLE dbo.columns
(
TableId int NOT NULL /*CONSTRAINT columns__FK_tables FOREIGN KEY REFERENCES dbo.tables ( TableId )*/,
ColumnId int IDENTITY(1, 1) NOT NULL,
FieldName varchar(100) NULL,
PhysicalFieldName varchar(100) NOT NULL,
DataType varchar(50) NULL,
Length varchar(10) NULL,
NewDataType varchar(50) NULL,
NewDataTypeImplementation tinyint NULL,
CONSTRAINT columns__PK PRIMARY KEY ( TableId, ColumnId )
);
CREATE TABLE dbo.primary_key_columns
(
PkId int IDENTITY(1, 1) NOT NULL,
TableId int NOT NULL,
ColumnId int NOT NULL
/*CONSTRAINT primary_key_columns__FK_columns FOREIGN KEY REFERENCES dbo.columns ( TableId, ColumnId )*/
);
CREATE TABLE dbo.foreign_key_columns
(
TableIdFrom int NOT NULL,
ColumnIdFrom int NOT NULL,
KeySequence tinyint NOT NULL,
TableIdTo int NULL,
ColumnIdTo int NULL --,
/*CONSTRAINT foreign_key_columns__FK_columns1 FOREIGN KEY REFERENCES dbo.columns ( TableIdFrom, ColumnIdFrom )*/,
/*CONSTRAINT foreign_key_columns__FK_columns2 FOREIGN KEY REFERENCES dbo.columns ( TableIdTo, ColumnIdTo )*/
);
/* Main code to load the control tables. */
DECLARE /* data dictionary columns */
@TableName varchar(100),
@PhysicalTableName varchar(100),
@PrimaryKey varchar(50),
@ForeignKey1 varchar(50),
@ForeignKey2 varchar(50),
@FieldName varchar(50),
@PhysicalFieldName varchar(50),
@DataType varchar(50),
@Length varchar(10)
DECLARE @ColumnId int
DECLARE @TableId int
DECLARE cursor_data_dictionary CURSOR LOCAL FAST_FORWARD FOR
SELECT
ddi.TableName, ddi.PhysicalTableName,
ddi.PrimaryKey,
ddi.ForeignKey1, ddi.ForeignKey2,
ddi.FieldName, ddi.PhysicalFieldName,
ddi.DataType, ddi.Length
FROM dbo.data_dictionary_import ddi;
--ORDER BY ddi.TableName, ddi.PhysicalTableName
OPEN cursor_data_dictionary;
/* Load all main table info (no FK info). */
WHILE 1 = 1
BEGIN
FETCH NEXT FROM cursor_data_dictionary INTO @TableName, @PhysicalTableName,
@PrimaryKey,
@ForeignKey1, @ForeignKey2,
@FieldName, @PhysicalFieldName,
@DataType, @Length
IF @@FETCH_STATUS <> 0
IF @@FETCH_STATUS = -1
BREAK
ELSE
CONTINUE;
IF EXISTS(SELECT 1 FROM dbo.tables WHERE PhysicalTableName = @PhysicalTableName)
BEGIN
SELECT @TableId = TableId
FROM dbo.tables
WHERE PhysicalTableName = @PhysicalTableName
END /*IF*/
ELSE
BEGIN
INSERT INTO dbo.tables ( TableName, PhysicalTableName )
SELECT @TableName, @PhysicalTableName
SET @TableId = SCOPE_IDENTITY()
END /*ELSE*/
IF @PrimaryKey = 'X'
BEGIN
IF EXISTS(SELECT 1 FROM dbo.columns WHERE TableId = @TableId AND PhysicalFieldName = @PhysicalFieldName)
BEGIN
SELECT @ColumnId = ColumnId
FROM dbo.columns
WHERE TableId = @TableId AND PhysicalFieldName = @PhysicalFieldName
END /*IF*/
ELSE
BEGIN
INSERT INTO dbo.columns ( TableId, FieldName, PhysicalFieldName, DataType, Length )
SELECT @TableId, REPLACE(@FieldName, '*', ''), REPLACE(@PhysicalFieldName, '*', ''), @DataType, @Length
SET @ColumnId = SCOPE_IDENTITY()
END /*ELSE*/
IF NOT EXISTS(SELECT 1 FROM dbo.primary_key_columns WHERE TableId = @TableId AND ColumnId = @ColumnId)
BEGIN
INSERT INTO dbo.primary_key_columns ( TableId, ColumnId )
SELECT @TableId, @ColumnId
END /*IF*/
END /*IF*/
ELSE
IF NOT EXISTS(SELECT 1 FROM dbo.columns WHERE TableId = @TableId AND PhysicalFieldName = REPLACE(@PhysicalFieldName, '*', ''))
BEGIN
INSERT INTO dbo.columns ( TableId, FieldName, PhysicalFieldName, DataType, Length )
SELECT @TableId, REPLACE(@FieldName, '*', ''), REPLACE(@PhysicalFieldName, '*', ''), @DataType, @Length
SET @ColumnId = SCOPE_IDENTITY()
END /*IF*/
END /*WHILE*/
CLOSE cursor_data_dictionary;
UPDATE t
SET PrimaryKeyCount = ISNULL(c.PrimaryKeyCount, 0)
FROM dbo.tables t
LEFT OUTER JOIN (
SELECT TableId, COUNT(*) AS PrimaryKeyCount
FROM dbo.primary_key_columns
GROUP BY TableId
) AS c ON c.TableId = t.TableId
SELECT 'tables' AS table_name, * FROM dbo.tables;
SELECT 'columns' AS table_name, * FROM dbo.columns;
SELECT 'primary_key_columns' AS table_name, * FROM dbo.primary_key_columns;
OPEN cursor_data_dictionary;
/* Load FK info (only). */
WHILE 1 = 1
BEGIN
FETCH NEXT FROM cursor_data_dictionary INTO @TableName, @PhysicalTableName,
@PrimaryKey,
@ForeignKey1, @ForeignKey2,
@FieldName, @PhysicalFieldName,
@DataType, @Length
IF @@FETCH_STATUS <> 0
IF @@FETCH_STATUS = -1
BREAK
ELSE
CONTINUE;
IF @ForeignKey1 = ''
CONTINUE;
/* Load FK info here */
END /*WHILE*/
DEALLOCATE cursor_data_dictionary;
SELECT 'foreign_key_columns' AS table_name, * FROM dbo.foreign_key_columns;
This would be very very difficult to build the SQL even after insertion of CSV into the table. Please use below code to import the data.
Open in new window
OUTPUT
Open in new window