从表参数SQL Server动态创建表

时间:2018-10-28 18:17:38

标签: sql-server

我想以某种方式使表创建自动化,因为每天客户可以添加一些列,删除一些列,所以我的想法是将表名和列传递到表中,然后在存储过程中使用该表来自动创建表。

这是将保存表结构的表

create table nada_test 
(
    table_name varchar(500),
    col_name varchar(100),
    col_type varchar(100)
)

样本数据:

insert into nada_test 
values ('data', 'salary', 'int'), ('data', 'id', 'int'),
       ('data', 'job', 'varchar(100)')

有人可以告诉我如何实现这一目标吗?

3 个答案:

答案 0 :(得分:1)

那怎么样

CREATE TABLE T
(
  TableName varchar(500),
  ColName varchar(100),
  ColType varchar(100)
);

INSERT INTO T VALUES
('data','salary','int'),
('data',   'id',   'int'),
('data',   'job',  'varchar(100)');

DECLARE @SQL NVARCHAR(MAX);

SELECT @SQL = N'CREATE TABLE Data ('+ STUFF((
            SELECT ',' + ColName + ' ' + ColType
            FROM T
            FOR XML PATH('')
            ), 1, 1, '') + N' );'
FROM T;

SELECT @SQL [CreateTable];

--EXECUTE sp_executesql @SQL;

但这对您没有帮助

  • 表中已存在的数据将如何处理?

  • 如果表已经存在,可以通过IF OBJECT_ID() ..传递,但是,表中已经存在的数据又会如何呢?

  • 即使将数据存储在temp表中,您也会面临另一个问题,因为两个表的结构甚至列的数据类型都不相同。

答案 1 :(得分:0)

通常我们可以使用

create table x as select * from y ;

在这种情况下,使用一些现有的表结构说y 您可以根据现有需求创建ddl触发器,即对此表进行任何更改 然后在上方触发相同的查询。

答案 2 :(得分:0)

如前所述,您的方法非常容易受到SQL注入的攻击。 参见示例:

insert into #nada_test
values ('TestTable] (TestColumn int);SELECT * FROM sys.tables--', 'TestColumn', 'INT')
GO
DECLARE @TableName sysname, @ColumnName sysname, @Type VARCHAR(100), @SQL VARCHAR(2000)

WHILE EXISTS (SELECT TOP 1 1 FROM #nada_test)
BEGIN
    SELECT TOP 1 @TableName = table_name, @ColumnName = [col_name], @Type = col_type FROM #nada_test
    DELETE FROM #nada_test WHERE @TableName = table_name and @ColumnName = [col_name]

    IF NOT EXISTS ( SELECT TOP 1 1 FROM sys.tables WHERE name = @TableName)
        SET @SQL = 'CREATE TABLE [' + @TableName + '] ([' + @ColumnName + '] ' + @Type + ');'
    ELSE IF NOT EXISTS ( SELECT TOP 1 1 FROM sys.columns WHERE name = @ColumnName AND object_id = OBJECT_ID(@TableName))
        SET @SQL = 'ALTER TABLE [' + @TableName + '] ADD [' + @ColumnName + '] ' + @Type + ';'
    ELSE
        SET @SQL = 'PRINT ''TABLE name [' + @TableName + '] with column [' + @ColumnName + '] is already exists'';'
    PRINT @SQL
    EXEC (@SQL)
END