我有两个数据库: -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语句吗?
提前致谢!
答案 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;