2011-02-04 25 views
6

我在写一个存储过程,该存储过程执行多个连续的SELECT语句。当我通过ADO.NET执行此过程时,我的意图是以包含若干DataTable对象的DataSet结束。这表现如预期。为SQL Server结果集中的表分配名称

我目前依靠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声明的顺序,并始终按索引访问所需的表?

回答

5

我还没有试过,但让你有你能不能改变存储过程的结构一个查询在每次数据查询之前返回表的名称?

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

然后通过创建表和将它们添加手动构建数据集?

2

不幸的是,我不相信这是可能的!我有一个类似的设置,它从存储过程中获取数据集,然后看着我放弃并使用索引。

1

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

select 'MyTable;MySecondTable;ThirdOrSo' as tables 

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

+0

谢谢;你的建议在一定程度上有所帮助,虽然它不是理想的。至少这将负责处理与数据库的任何错误,而不是客户端应用程序。 – 2011-02-04 10:41:05

3

您的查询返回的表格将被命名为“表格”,“表格1”,“表格2”等。

您可以填充DataSet中把它们映射到你的表名前添加使用TableMappings到您的DataAdapter:

myAdapter.TableMappings.Add("Table", "MyTable1"); 
myAdapter.TableMappings.Add("Table1", "MyTable2"); 
myAdapter.TableMappings.Add("Table2", "MyTable3"); 
+2

这并没有解决后期的初始问题,程序维护人员不用担心查询顺序的能力。 – mmix 2011-02-04 10:12:57

+0

它并没有给出他要求的确切内容:他仍然需要编写自己的SP以特定的顺序返回结果集(在我看来,这是一个合理的限制)。但之后他可以通过名称而不是索引访问结果数据集中的表,并限制结果返回到填充DataSet的DAL类的顺序的知识。 – Joe 2011-02-04 11:12:47

0

我一直在想这个问题,我能想到的唯一解决方案是在过程中创建临时表并将结果填充到那里(随时为表命名)。

我还没有尝试过,因为它不觉得正确的方法来做两次(查询到临时表,查询临时表)。

,如果你可以只重命名结果在SQL中,你可以重命名以同样的方式“列[自定义列]”设置这将是非常有用的...

2

这也不是最好的解决办法,但您可以使查询中的第一列为表名:

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