如何select列名称并获取SQL Server的数据?

我想请求帮助获得一个SELECT语句,这将有助于我目前的困境。 我正在使用SQL Server在vb.net中创build一个新项目,而我的雇主希望我创build的其中一个报表是使用他们给我的excel文件中的数据获取所需的部分名称和数量,但是,它的工作原理与这个:

样品表

数据实际上比这个大很多(比如200多个部分),但这是一般的想法。 我将把DWG名称放入它,并且我想要一个有这样的输出的SELECT:

(如果用户正在通过DWG1 🙂

DWG1 1 Part3 DWG1 2 Part4 DWG1 1 Part5 

有没有办法只抓住其中的数字大于0的列名称,得到确切的数字是什么,然后列名? 我不认为给我Excel文件的人有正确的表格结构。

UNPIVOT会更高效,但如果您不想指定200个字段 ,请考虑这一点:

 Declare @YourTable table (DWG varchar(25),Part1 int,Part2 int,Part3 int,Part4 int,Part5 int) Insert into @YourTable values ('DWG1',0,0,1,2,1), ('DWG2',0,0,0,0,1) Select C.* From @YourTable A Cross Apply (Select XMLData=cast((Select A.* for XML RAW) as xml)) B Cross Apply ( Select DWG = r.value('@DWG','varchar(25)') --<< case sensitive ,Item = attr.value('local-name(.)','varchar(100)') ,Value = attr.value('.','varchar(max)') --<< can be int if desired From B.XMLData.nodes('/row') as A(r) Cross Apply Arnodes('./@*') as B(attr) Where attr.value('local-name(.)','varchar(100)') not in ('DWG','OtherFieldsToExclude') ) C --Where A.DWG='DWG1' 

返回

 DWG Item Value DWG1 Part1 0 DWG1 Part2 0 DWG1 Part3 1 DWG1 Part4 2 DWG1 Part5 1 DWG2 Part1 0 DWG2 Part2 0 DWG2 Part3 0 DWG2 Part4 0 DWG2 Part5 1 

从具有此数据的电子表格开始:

在这里输入图像说明

我用一个小程序从电子表格文件中读取数据并输出,如下所示:

 Option Infer On Option Strict On Imports System.Data.OleDb Module Module1 Class Part Property Name As String Property Quantity As Decimal Public Overrides Function ToString() As String Return $"{Name}: {Quantity}" End Function End Class Class Dwg Property Name As String Property Parts As List(Of Part) Public Overrides Function ToString() As String Return $"{Name} - {String.Join(", ", Parts)}" End Function End Class Sub Main() Dim xlFile = "C:\temp\PartsList.xlsx" Dim connStr = $"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={xlFile};Extended Properties=""Excel 12.0 Xml;HDR=YES"";" Dim dt As New DataTable Using conn = New OleDbConnection(connStr) Dim qry = "SELECT * FROM [Sheet1$]" Using da = New OleDbDataAdapter(qry, conn) da.Fill(dt) End Using End Using ' To show the column names... 'For Each col As DataColumn In dt.Columns ' Console.WriteLine(col.ColumnName) 'Next Dim dwgs As New List(Of Dwg) ' Read the data into a list... ' For i = 0 To dt.Rows.Count - 1 Dim dx As New Dwg With {.Name = CStr(dt.Rows(i)(0))} Dim parts As New List(Of Part) For j = 1 To dt.Columns.Count - 1 Dim qty = CDec(dt.Rows(i)(j)) If qty <> 0 Then parts.Add(New Part With {.Name = dt.Columns(j).ColumnName, .Quantity = qty}) End If Next dx.Parts = parts dwgs.Add(dx) Next ' Show all the data read... ' Console.WriteLine("ALL DWGS:-") For Each d As Dwg In dwgs Console.WriteLine(d.ToString()) Next Console.WriteLine() ' Show the data from a selected item... ' Dim selectedDwg = "DWG1" Console.WriteLine($"Drawing {selectedDwg}:-") Dim dw = dwgs.First(Function(x) x.Name = selectedDwg) If dw IsNot Nothing Then For Each p In dw.Parts Console.WriteLine($"{dw.Name,-10}{p.Quantity,-8}{p.Name,-12}") Next End If Console.ReadLine() End Sub End Module 

输出:

 ALL DWGS:- DWG1 - Sprocket: 1, Widget: 2, Part 5: 1 DWG2 - Part 5: 1 DWG3 - Part 1: 1, Sprocket: 2, Widget: 1 Drawing DWG1:- DWG1 1 Sprocket DWG1 2 Widget DWG1 1 Part 5 

一旦你在程序中有了数据,就可以很容易地用适当的模式将它插入到SQL Server等数据库中。

[我没有使用Excel创build电子表格 – 我使用LibreOffice Calc并将其保存为xlsx文件,并且我必须在连接string中为Provider提供Microsoft Access数据库引擎2010 Redistributable。]