我有一个返回多个表的存储过程。
它正确填充我的数据集,但它命名我的表[Table
,Table1
,Table2
,......]。
我可以在数据库层(到我的存储过程)中添加哪些内容来正确命名表吗?
答案 0 :(得分:3)
你的SP实际上并没有返回多个表,它从表中返回一系列列和行,因此没有'表名',因此它们被命名为table1,table2等。如果它很重要,你可以为每个选择返回一个额外的列,并在该列中填入所需的名称,然后从那里使用它。
即。
select *,'MyTableName1' As [TableName] name from mytablename1
select *,'MyTableName2' As [TableName] name from mytablename2
答案 1 :(得分:0)
在存储过程中:
select CH.PrimaryKey, CH.Name,
NULL "CustomerHeader"
from CustomerHeader "CH";
--
select CD.PrimaryKey, CD.ShipTo,
NULL "CustomerDetail"
from CustomerDetail "CD";
--
select *, NULL "Orders"
from OrderTable;
在Vb.Net代码中:
Dim ds As DataSet = Nothing
ds = SqlExecute();
Dim dtCustHeader As DataTable = Nothing
Dim dtCustDetail As DataTable = Nothing
Dim dtOrders As DataTable = Nothing
For Each dt As DataTable In ds.tables
Select Case True
Case dt.Columns.Contains("CustomerHeader")
dtCustHeader = dt
Case dt.Columns.Contains("CustomerDetail")
dtCustDetail = dt
Case dt.Columns.Contains("Orders")
dtOrders = dt
End Select
Next
有点SILLY(或STUPID)您无法在结果集中命名表。 但是这样就可以在没有重复字节计数的情况下重复每一行中的表名。
仍有开销为每行传回NULL值。也许传递BIT值会更小......
另一种方法是始终使用column(0): 在SQL中:
select NULL "CustomerDetail", CustName,Addr1,Addr2... from CustomerDetail;
在vb.net中:
Dim ds As DataSet = Nothing
ds = SqlExecute();
Dim dtCustHeader As DataTable = Nothing
Dim dtCustDetail As DataTable = Nothing
Dim dtOrders As DataTable = Nothing
For Each dt As DataTable In ds.Tables
Dim tblName As String = dt.Columns(0).ColumnName
Select Case tblName.ToUpper
Case "CUSTOMERDETAIL" : dtCustHeader = dt
Case "CUSTOMERDETAIL" : dtCustDetail = dt
Case "ORDERS" : dtOrders = dt
End Select
Next
即使查询返回零行,这些方法也会获取表名。
但最后一次 ...每次FROM SQL STORED PROCEDURE(在您的代码的帮助下)自动命名数据集中的表的方法:
Dim ds As DataSet = Nothing
ds = SqlExecute();
For Each dt As DataTable In ds.Tables
dt.TableName = dt.Columns(0).ColumnName
Next
在此之后,您可以在存储过程中使用您控制的名称访问您的表格......因为它应该是从第一天开始的!
编辑:选择性实施: 命名模式中的第一列" TN:Customer"。 您的旧存储过程正常工作,只会影响您要修改的存储过程。
For Each dt As DataTable In mo_LastDataset.Tables
Dim tblName() As String = dt.Columns(0).ColumnName.Split(":")
If tblName.Length >= 2 AndAlso tblName(0).ToUpper = "TN" Then
dt.TableName = tblName(1)
End If
Next
......大卫......