我想以某种方式使表创建自动化,因为每天客户可以添加一些列,删除一些列,所以我的想法是将表名和列传递到表中,然后在存储过程中使用该表来自动创建表。
这是将保存表结构的表
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)')
有人可以告诉我如何实现这一目标吗?
答案 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