【发布时间】:2015-07-20 10:44:02
【问题描述】:
我正在使用 SQL Server 2008 中的两个表:foo 和 foo_mod,它们具有以下架构:
CREATE TABLE foo
(
[bar] DATETIME NULL ,
[bar1] VARCHAR(20) NULL ,
[different_column] VARCHAR(50) NOT NULL
)
CREATE TABLE foo_mod
(
[bar] DATETIME NULL ,
[bar1] VARCHAR(20) NULL
)
我想构建一个 SQL 脚本来执行以下操作:
对于foo 的每一列,检查foo_mod 中是否存在该列,如果不存在,则更改foo_mod 以添加缺失的列。
在本例中,我的脚本将返回以下内容:
IF COL_LENGTH('foo_mod','bar') IS NULL BEGIN
ALTER TABLE foo_mod
ADD bar DATETIME NULLL;
END
IF COL_LENGTH('foo_mod','bar1') IS NULL BEGIN
ALTER TABLE foo_mod
ADD bar1 VARCHAR(20) NULL;
END
IF COL_LENGTH('foo_mod','different_column') IS NULL BEGIN
ALTER TABLE foo_mod
ADD different_column VARCHAR(50) NOT NULL;
END
现在我的脚本使用光标循环遍历第一个表中的INFORMATION_SCHEMA.COLUMNS:
DECLARE @column_name VARCHAR(max);
DECLARE @is_nullable VARCHAR(3);
DECLARE @data_type NVARCHAR(128);
DECLARE @default NVARCHAR(4000);
DECLARE @max_lengh INT;
DECLARE @sql VARCHAR(max);
DECLARE @output VARCHAR(max);
SET @output = '';
DECLARE col_names_cursor CURSOR
FOR
SELECT COLUMN_NAME, IS_NULLABLE, DATA_TYPE, COLUMN_DEFAULT, CHARACTER_MAXIMUM_LENGTH
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = N'foo'
OPEN col_names_cursor
FETCH NEXT FROM col_names_cursor INTO @column_name, @is_nullable, @data_type,@default, @max_lengh;
WHILE @@FETCH_STATUS = 0
BEGIN
SET @sql = 'IF COL_LENGTH(''foo_mod'','''@column_name''') IS NULL BEGIN ALTER TABLE ''foo_mod'' ADD '
SET @sql += ? -- build sql script from informations
FETCH NEXT FROM col_names_cursor INTO @column_name, @is_nullable, @data_type,@default, @max_lengh;
END
CLOSE col_names_cursor;
DEALLOCATE col_names_cursor;
有没有一种简单的方法可以根据给定的信息构建 SQL 语句?
谢谢!
【问题讨论】:
标签: sql sql-server sql-server-2008 alter-table