Sql server 使用sys.columns查找SQL表值

Sql server 使用sys.columns查找SQL表值,sql-server,sql-like,dynamic-sql,lookup-tables,Sql Server,Sql Like,Dynamic Sql,Lookup Tables,比如说,我有来自超市的数据,这些数据告诉我每种水果的销售量,我想知道每个超市出售的红色和绿色水果的总数。我有三张桌子: 表1是一个临时表,显示了每个超市销售的水果数量,并为变量列名称指定了值: ╔═══════╦════════╦════════╗ ║ Apple ║ Banana ║ Cherry ║ ╠═══════╬════════╬════════╣ ║ 1 ║ 5 ║ 7 ║ ║ 3 ║ 0 ║ 4 ║ ╚═══════╩════

比如说,我有来自超市的数据,这些数据告诉我每种水果的销售量,我想知道每个超市出售的红色和绿色水果的总数。我有三张桌子:

表1是一个临时表,显示了每个超市销售的水果数量,并为变量列名称指定了值:

╔═══════╦════════╦════════╗
║ Apple ║ Banana ║ Cherry ║
╠═══════╬════════╬════════╣
║     1 ║      5 ║      7 ║
║     3 ║      0 ║      4 ║
╚═══════╩════════╩════════╝
表2是一个永久性的表,在第一列中有我想要的列名,以及我需要它查找的文本(例如,我不想要黄色水果,所以我不想导入香蕉的值):

表3是我的最终永久表,其中包含我所需的列和值:

╔═════════════╦═════╦═══════╗
║ Supermarket ║ Red ║ Green ║
╠═════════════╬═════╬═══════╣
║ Temco       ║   6 ║     8 ║
║ ASPA        ║   2 ║     4 ║
║ Sansbrys    ║   2 ║     1 ║
║ Morris      ║   5 ║     3 ║
╚═════════════╩═════╩═══════╝
使用表2中的值查找表1中的列名,然后将所需的值插入表3中的最佳方法是什么

我已经到了这个阶段,在没有使用查找表2的情况下,流程的下半部分会做什么,但完全停留在上半部分:

declare @sql nvarchar(max),
        @Columns nvarchar(2000)
declare @table nvarchar(256) = '[etl].[Temco]'
truncate table etl.Supermarkets
SELECT @Columns = COALESCE(@Columns + ', ', '') + quotename(column_name)
from information_schema.columns 
where table_name= 'Temco' and (column_name like '%Apple%' OR COLUMN_NAME LIKE '%Cherry%')
PRINT @Columns
set @Columns = left(@Columns,len(@Columns)-1) -- remove trailing comma
set @sql = ' insert into [etl].[Supermarkets]
 ([Red])
 SELECT ' + @Columns + '] from  ' +@table+' '
PRINT @sql
EXECUTE sp_executesql @sql, N'@table nvarchar(256)',
@table = @table 

最好的解决方案是将表1规范化为一个已知的结构。在我看来,这个表似乎有3列(SupermarketID、Fruit、quantitysell),而不是您正在处理的非规范化噩梦。您似乎对表2也有同样的规范化问题。@SeanLange这很理想,但我无法控制表1中的表,因此我需要一种使用查找表仅提取某些列的方法。您的查找表也同样糟糕。您在这里苦苦挣扎的原因是表没有规范化。然后是最后的第三个表,它是设计糟糕的表的延续。这不啻是为了克服糟糕的设计而做出的巨大努力。如果ddl操作正确,则检索数据很简单。既然您似乎无法修复灾难性的结构,那么您必须向我们提供一些关于表的详细信息。
declare @sql nvarchar(max),
        @Columns nvarchar(2000)
declare @table nvarchar(256) = '[etl].[Temco]'
truncate table etl.Supermarkets
SELECT @Columns = COALESCE(@Columns + ', ', '') + quotename(column_name)
from information_schema.columns 
where table_name= 'Temco' and (column_name like '%Apple%' OR COLUMN_NAME LIKE '%Cherry%')
PRINT @Columns
set @Columns = left(@Columns,len(@Columns)-1) -- remove trailing comma
set @sql = ' insert into [etl].[Supermarkets]
 ([Red])
 SELECT ' + @Columns + '] from  ' +@table+' '
PRINT @sql
EXECUTE sp_executesql @sql, N'@table nvarchar(256)',
@table = @table