为SQL Server结果集中的表指定名称

disbfnqx  于 2022-12-17  发布在  SQL Server
关注(0)|答案(6)|浏览(223)

我正在编写一个存储过程,该过程执行几个连续的SELECT语句。当我通过ADO.NET执行此过程时,我的目的是以包含几个DataTable对象的DataSet结束。这符合预期。
我目前依赖于DataSet中表的顺序来匹配存储过程中SELECT语句的顺序,但是这个顺序实际上没有什么意义,最终维护过程的人不应该知道结果的预期顺序,维持申请的人也不必知道程序中陈述的顺序。
我想知道的是,是否可以在存储过程本身中为每个SELECT语句的结果赋值,然后通过ADO.NET(希望是无缝的)传递这些结果,以便我可以按名称而不是顺序访问每个表?
例如:

// populate DataSet with results from stored proc
DataSet ds = new DataSet();
dataAdapter.Fill(ds);

// now access one of the resulting DataTable via name
return ds.Tables["NamedResultFromTheProc"];

那么,有什么方法可以实现这个目标呢?或者我必须依赖于SELECT语句的顺序,并且总是通过索引访问所需的表吗?

xvw2m8pv

xvw2m8pv1#

我没有尝试过这种方法,但是您可以不更改存储过程的结构,以便在每次数据查询之前都有一个返回表名的查询吗?

select 'TableName';
select * from Table where 1 = 1;

然后通过创建表并添加表来手动构建数据集?

wtzytmuj

wtzytmuj2#

查询返回的表将被命名为“Table”、“Table1”、“Table2”等。
您可以在填充数据集之前将TableMappings添加到DataAdapter,以将它们Map到表名:

myAdapter.TableMappings.Add("Table", "MyTable1");
myAdapter.TableMappings.Add("Table1", "MyTable2");
myAdapter.TableMappings.Add("Table2", "MyTable3");
0tdrvxhp

0tdrvxhp3#

不幸的是,我不相信这是可能的!我有一个类似的设置,从存储过程中获取数据集,看了之后我放弃了,求助于索引。

yyyllmsg

yyyllmsg4#

这也不是最佳解决方案,但您可以将查询中的第一列设为表名:

Select 'Customer', CustomerID, CustomerName, CustomerAddress
    From Customer
    Where CustomerID = @CustomerID;
    
    Select 'Orders', OrderID, OrderPrice, OrderDate
    From Order O
    Join Customer C on C.CustomerID = O.CustomerID
    Where C.CustomerID = @CustomerID;
    
    Select 'OrderItems', ItemID, ItemDescription, ItemPrice
    From OrderItems I
    Join Order O on O.OrderID = I.OrderID
    Join Customer C on C.CustomerID = O.CustomerID
    Where C.CustomerID = @CustomerID;
jk9hmnmh

jk9hmnmh5#

这是不可能的,但它的SQL“错误”,而不是DataAdapter/Set的错误,因为结果集不携带所查询的表的名称(如果您使用内部连接,这也是不可能的),表适配器也没有从中选取名称的查询。您可以使用的一种方法是首先在过程中返回一个表列表作为Query#0,例如:

select 'MyTable;MySecondTable;ThirdOrSo' as tables

接着是所有其他查询,然后读取索引0表和此字段,split/forloop以重命名数据集中的其他表。维护者仍然需要了解机制,但至少它给了他一些重组的自由。

nbysray5

nbysray56#

我也一直在考虑这个问题,我能想到的唯一解决方案是在过程中创建临时表,并将结果填充到其中(根据需要命名表)。
我还没有尝试过这个方法,因为它感觉不像是正确的方法,因为必须获得两次结果(查询到临时表,查询临时表)。
如果您可以用SQL重命名结果集,就像重命名“Column AS [Custom Column]"一样,这将非常有用...

相关问题