2011-02-04 2 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 

다음 테이블을 만들고에 추가하여 데이터 집합을 수동으로 구축?

+0

그게 문제를 해결할 수 있지만, 그 규칙을 따르는 절차를 유지하는 사람에게 여전히 onice를 놓습니다. 나는 T-SQL에 의해 직접적으로 지원되는 더 엄격한 솔루션을 원했지만 그러한 기능이없는 것 같습니다. –

2

불행히도, 나는 이것이 가능하다고 생각하지 않습니다! 저장 프로 시저 (Stored Procedures)에서 DataSets을 가져 오는 비슷한 설정이 있는데, 찾고 난 후에는 포기하고 인덱스를 사용했습니다.

1

결과 집합이 쿼리 된 테이블의 이름을 전달하지 못하기 때문에 DataAdapter/Set의 오류가 아니라 SQL "fault"가 아니며 (내부 조인을 사용할 경우 눈에 띄게 가능하지도 않음) 테이블 어댑터에는 이름을 선택할 쿼리가 있습니다. 사용할 수있는 한 가지 방법은 먼저 프로 시저에서 Query # 0으로 테이블 목록을 반환하는 것입니다. 다른 모든 쿼리 뒤에

select 'MyTable;MySecondTable;ThirdOrSo' as tables 

는 다음 인덱스 0 테이블과 데이터 세트에서 다른 테이블의 이름을 변경하기 위해이 분야, 분할/forloop를 참조하십시오. 관리자는 메커니즘을 알아야하지만 적어도 재구성 할 수있는 자유가 있습니다.

+0

감사합니다; 귀하의 제안은 이상적이지는 않지만 어느 정도 도움이됩니다. 적어도 이것은 클라이언트 응용 프로그램이 아니라 데이터베이스와의 실수를 안전하게 처리해야합니다. –

3

쿼리에서 반환하는 테이블의 이름은 "Table1", "Table1", "Table2"등이됩니다.

당신은 당신의 테이블 이름에 매핑하기 위해 데이터 집합을 작성하기 전에 데이터 어댑터에 TableMappings을 추가 할 수 있습니다

:

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

이것은 게시물의 초기 문제점을 해결하지 못합니다. 프로 시저 관리자가 쿼리 순서에 대해 걱정하지 않아도됩니다. – mmix

+0

그것은 그가 요구하고있는 것을 정확하게주지는 않습니다 : 그는 여전히 특정 순서로 결과 집합을 반환하도록 SP를 코딩해야합니다 (내 견해로는 합당한 제한). 그러나 나중에 결과 데이터 집합의 테이블에 인덱스가 아닌 이름으로 액세스 할 수 있으며 결과가 반환되는 순서에 대한 지식을 데이터 집합을 채우는 DAL 클래스로 제한 할 수 있습니다. – Joe

0

나는 이것에 대해서도 생각해 왔으며 내가 생각할 수있는 유일한 해결책은 프로 시저 내에 임시 테이블을 만들고 그 결과를 거기에 채우는 것이다.

필자는 아직 두 번 결과를 얻지 않고 (임시 테이블에 쿼리하고 임시 테이블을 쿼리하는) 올바른 방법으로 느끼지 않기 때문에 아직 시도하지 않았습니다.

당신이 당신의 결과는 당신이 이름을 바꿀 수 있습니다 같은 방법으로 "열 AS [사용자 칼럼]"에 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 
관련 문제