Sql server SQL在WHILE或FOR NEXT循环中生成列名

Sql server SQL在WHILE或FOR NEXT循环中生成列名,sql-server,tsql,Sql Server,Tsql,我正在从如下查询中的20列中选择不同的值,并想知道是否可以通过使用循环以更整洁的方式进行此操作?在阅读了这里关于类似主题的一些答案后,似乎普遍的共识是,要避免使用动态SQL吗 在我的例子中,我只是希望有一个硬编码的“缺陷”,并将一个整数变量连接到每个循环的末尾,即1,2,3,4。。。。20这有可能吗?我当前的查询看起来是这样的,但它看起来并不漂亮 SELECT Defect1 AS HashKeys FROM VisionMachineResults UNION SELECT Defect2 F

我正在从如下查询中的20列中选择不同的值,并想知道是否可以通过使用循环以更整洁的方式进行此操作?在阅读了这里关于类似主题的一些答案后,似乎普遍的共识是,要避免使用动态SQL吗

在我的例子中,我只是希望有一个硬编码的“缺陷”,并将一个整数变量连接到每个循环的末尾,即1,2,3,4。。。。20这有可能吗?我当前的查询看起来是这样的,但它看起来并不漂亮

SELECT Defect1 AS HashKeys FROM VisionMachineResults
UNION
SELECT Defect2 FROM VisionMachineResults
UNION
SELECT Defect3 FROM VisionMachineResults
UNION
SELECT Defect4 FROM VisionMachineResults
UNION
SELECT Defect5 FROM VisionMachineResults
UNION
SELECT Defect6 FROM VisionMachineResults
UNION
SELECT Defect7 FROM VisionMachineResults
UNION
SELECT Defect8 FROM VisionMachineResults
UNION
SELECT Defect9 FROM VisionMachineResults
UNION
SELECT Defect10 FROM VisionMachineResults
UNION
SELECT Defect11 FROM VisionMachineResults
UNION
SELECT Defect12 FROM VisionMachineResults
UNION
SELECT Defect13 FROM VisionMachineResults
UNION
SELECT Defect14 FROM VisionMachineResults
UNION
SELECT Defect15 FROM VisionMachineResults
UNION
SELECT Defect16 FROM VisionMachineResults
UNION
SELECT Defect17 FROM VisionMachineResults
UNION
SELECT Defect18 FROM VisionMachineResults
UNION
SELECT Defect19 FROM VisionMachineResults
UNION
SELECT Defect20 FROM VisionMachineResults

您可以尝试使用
UNPIVOT

SELECT DISTINCT [value]
FROM VisionMachineResults
UNPIVOT
(
    [value] FOR [column] IN ([Defect1], [Defect2], ... [Defectn])
) UNPVT;

此表中的每一行表示自动检查的零件。缺陷是散列键,在检查软件中生成并自动写入数据库。每个零件最多可记录20个缺陷。我认为您可能误解了TableDynamicSQL的意图,它不是您应该避免的—它只是一个工具,与其他工具一样。要正确使用它,一个人必须具备一定的技能水平——不幸的是,许多人没有。在编写代码时,您不应该太在意“整洁”或“漂亮”,而应该更在意正确性和效率。在这里,由于您的模式被破坏,您的任务变得更加乏味和困难。鉴于这可能是一次性的事情(您可以封装在视图中或保存代码片段中),替代品没有什么可获得的。而且,无论何时使用联合,都需要仔细考虑是否使用<代码>联合<代码> vs.代码>联合所有。是否有一种简单的方法来计算同一查询中出现的次数?例如,
[value]、count([value])
UNPVT
add
GROUP BY[value]