使用define SQL Server生成表

时间:2018-01-11 03:18:42

标签: sql-server stored-procedures

我有2个表来管理生成具有表名和列的真实表:

  • 表(TableID,TableName)
  • TableColumn(ColumnID,ColumnName,Datatype,Size) - (大小是nvarchar类型的大小,ID是自动标识(1,1))

表:

TableID    TableName
----------------------
1          TopCity

TableColumn中:

ColumnID    ColumnName    DataType    Size
-------------------------------------------
1           CityID        int         null
2           CityName      nvarchar    100

我想编写一个过程来创建真实的表TopCity(CityID,CityName),其中包含TableColumn中描述的列详细信息。

CREATE TABLE TopCity
(
    CityID INT IDENTITY(1,1),
    CityName NVARCHAR(100)
)

1 个答案:

答案 0 :(得分:0)

尝试这个:您必须在TableID中以TableColumn作为外键进行一些更改,以便明确表示列。最好将TableIDColumnID用作identity列。如果您有这些列identity,请使用WHILE循环,否则我们应该使用CURSOR

1-创建的表格应标记为created,因此不应再次运行,我们应在flag中创建Table列以维护它并在创建每个表后更新< / p>

2-如果您只想创建一个table,那么我们不需要任何LOOP

3-对于identity列,最好在Datatype表的TableColumn列中提及,如下所示

CREATE TABLE #Table(TableID INT IDENTITY(1,1), TableName VARCHAR(100))

CREATE TABLE #TableColumn(ColumnID INT IDENTITY(1,1), 
    TableID INT, --Add foreign key constraint
    ColumnName VARCHAR(100), 
    Datatype VARCHAR(50), 
    Size INT)

INSERT INTO #Table VALUES
('TopCity')

INSERT INTO #TableColumn VALUES
(1,'CityID','int identity(1,1)',null),
(1,'CityName','nvarchar',100)

DECLARE @ColumnList VARCHAR(1000), @TableName VARCHAR(100), @i INT = 1, @j INT = 0
SELECT @j = COUNT(*) FROM #table

WHILE @i <= @j
BEGIN
    SELECT @TableName = TableName FROM #Table WHERE TableID = @i
    SELECT 
        @ColumnList = COALESCE(@ColumnList + ', ', '') + '' + 
                    tc.ColumnName + ' ' + 
                    tc.Datatype + '' + 
                    CASE WHEN tc.Size IS NULL THEN '' ELSE CONCAT('(',CAST(tc.Size AS VARCHAR),')') END
    FROM #Table t
    INNER JOIN #TableColumn tc ON tc.TableID = t.TableID
    WHERE t.TableName = @TableName

    --SELECT @TableName, @ColumnList

    EXEC('CREATE TABLE  ' + @TableName + ' (  ' + @ColumnList + ' )')

    SET @i = @i + 1

END