我有2个表来管理生成具有表名和列的真实表:
表:
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)
)
答案 0 :(得分:0)
尝试这个:您必须在TableID
中以TableColumn
作为外键进行一些更改,以便明确表示列。最好将TableID
和ColumnID
用作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