动态更改数据库中的表

时间:2017-03-12 16:00:05

标签: sql sql-server tsql

我有两个数据库: -Pre-staging数据库:这个前缀为CCPREST_ -Staging Database:这有一个前缀CCST _

数据库中的实体很少说: 在CCPREST中,我们有CCPREST_Employees表 在CCST,我们有CCST_Employees表

现在,此Staging表一直在添加/删除数据库中的一些entite。这还包括在表格中添加一些额外的列。

CCPREST_Employees中的列列表: EmpdID,EmpName,工资,地址,******中国

CCST_Empployees中的列列表: EmpdID,EmpName,工资,地址,******中国,Country_Ext,GeoLocation_Ext

这两个额外的两列Country_Ext,GeoLocation_Ext也必须包含在CCPREST_Employees表中。通过这种方式,CCPREST数据库中有许多实体需要从CCST数据库中添加额外的列。

我编写了以下查询来识别额外的列:

SELECT * INTO #TEMP from    (SELECT A.TABLE_NAME [CCPREST_TABLES],A.COLUMN_NAME [CCPREST_COLUMNS],
B.TABLE_NAME [CCST_TABLES],B.COLUMN_NAME[CCST_COLUMNS],
B.DATA_TYPE [CCST_DATATYPES],B.CHARACTER_MAXIMUM_LENGTH [CCST_SIZE],B.IS_NULLABLE [CCST_ISNULLABLE]
FROM INFORMATION_SCHEMA.COLUMNS A --ccprest tables
    FULL OUTER JOIN [STG_Extract Database].INFORMATION_SCHEMA.COLUMNS B --ccst tables
    ON (A.COLUMN_NAME = B.COLUMN_NAME
        AND SUBSTRING(A.TABLE_NAME,9,LEN(A.TABLE_NAME)) = SUBSTRING(B.TABLE_NAME,6,LEN(B.TABLE_NAME)
        ))
WHERE B.TABLE_NAME LIKE 'CCST%') as X

这将给出以下结果: Output

现在我正在尝试编写一个动态SQL,它将创建多个ALTER语句以使用CCST_COLUMNS更新CCPREST_COLUMNS

select 'alter table '+CASE WHEN CCPREST_TABLES IS NULL THEN REPLACE(CCST_TABLES,'CCST','CCPREST')END+' add '+ccst_columns+' '+ccst_datatypes+'('+CCST_SIZE+')'

来自#temp

但这会产生一些错误的语法错误。 Msg 245,Level 16,State 1,Line 15 转换varchar值时转换失败')'''数据类型int。

任何人都可以帮我正确构建ALTER语句吗?

提前致谢!

1 个答案:

答案 0 :(得分:0)

您需要显式地将长度转换为字符串,以避免隐式转换并处理没有长度规范的数据类型。下面的示例适用于您的案例中的varchar和int数据类型,但如果您的表可能包含这些类型,则需要扩展以正确处理其他类型,如十进制(具有精度和比例)和datetime2,time,datetimeoffset(具有精度)

SELECT 'alter table '
    + CASE WHEN CCPREST_TABLES IS NULL THEN REPLACE(CCST_TABLES,'CCST','CCPREST') END
    +' add '+ccst_columns+' '+ccst_datatypes+COALESCE('('+CAST(CCST_SIZE AS varchar(10))+')','')
FROM #temp;
相关问题