未知列数场景下用动态SQL实现列值相乘计算
动态生成权重列与value列的相乘计算字段
要实现动态生成每个aaa_/bbb_前缀权重列与value列的相乘计算字段,只需在拼接动态SQL时,为每个权重列同时添加原始列和相乘计算列即可,同时注意处理SQL语句的格式问题。
完整动态SQL实现
DECLARE @sql nvarchar(max) SET @sql = 'SELECT [Id], [value] ' -- 遍历权重列,同时拼接原始列和计算列 SELECT @sql = @sql + ' ,[' + COLUMN_NAME + '] ,[' + COLUMN_NAME + '] * [value] AS [' + COLUMN_NAME + '_value]' FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'myTable' AND (COLUMN_NAME LIKE 'aaa_%' OR COLUMN_NAME LIKE 'bbb_%') -- 拼接FROM子句并执行动态SQL SET @sql = @sql + ' FROM myTable' EXEC sp_executesql @sql
关键说明
- 每个权重列对应生成两个SELECT项:原始权重列,以及该列与
value相乘的计算列(别名统一为列名_value格式) - 拼接时将每个列的两项换行排版,让生成的最终SQL更易读
- 无需额外处理多余逗号:初始SQL以
, [value]结尾,后续每个列的拼接以, [开头,天然避免了末尾多余逗号的问题
可选优化方案(适用于SQL Server 2017+)
如果需要更简洁的字符串拼接逻辑,可以使用STRING_AGG函数统一合并所有列项:
DECLARE @sql nvarchar(max) DECLARE @cols nvarchar(max) SELECT @cols = STRING_AGG( CONCAT( '[' + COLUMN_NAME + ']', ', [' + COLUMN_NAME + '] * [value] AS [' + COLUMN_NAME + '_value]' ), ', ' ) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'myTable' AND (COLUMN_NAME LIKE 'aaa_%' OR COLUMN_NAME LIKE 'bbb_%') SET @sql = 'SELECT [Id], [value], ' + @cols + ' FROM myTable' EXEC sp_executesql @sql
内容的提问来源于stack exchange,提问作者Garamvölgyi Mihály
相关产品推荐
相关产品推荐

