복붙노트

[SQL] 당신은 어떻게 당신이 저장된 프로 시저에서 반환 데이터 집합의 테이블 이름을 지정할 수 있습니다?

SQL

당신은 어떻게 당신이 저장된 프로 시저에서 반환 데이터 집합의 테이블 이름을 지정할 수 있습니다?

나는 다음과 같은 저장 프로 시저를 가지고

Create procedure psfoo ()
AS
select * from tbA
select * from tbB

나는 다음 데이터 이런 식으로 접근하고 있습니다 :

     Sql Command mySqlCommand = new SqlCommand("psfoo" , DbConnection)
     DataSet ds = new DataSet();
     mySqlCommand.CommandType = CommandType.StoredProcedure;
     SqlDataAdapter mySqlDataAdapter = new SqlDataAdapter();
     mySqlDataAdapter.SelectCommand = mySqlCommand;
     mySqlDataAdapter.Fill(ds);

내 테이블에 액세스 할 때 지금, 나는이 작업을 수행해야합니다 :

     DataTable datatableA = ds.Tables[0];
     DataTable datatableB = ds.Tables[1];

데이터 집합 테이블 속성은 (대신 INT의) 문자열에 의한 접근을 얻었다.

그것은 내가 대신 쓸 수 있도록 SQL 코드에서 테이블의 이름을 지정 가능 :

     DataTable datatableA = ds.Tables["NametbA"];
     DataTable datatableB = ds.Tables["NametbB"];

그 차이를 만드는 경우 나, SQL 서버 2008을 사용하고 있습니다.

해결법

  1. ==============================

    1.내가 아는 한 지금까지와 같이 저장된 프로 시저에서, 당신은 할 수 없습니다. 당신은, 그러나, 당신은 데이터 집합을 검색 한 후 이름을 설정 한 다음 다음부터 사용할 수 있습니다.

    내가 아는 한 지금까지와 같이 저장된 프로 시저에서, 당신은 할 수 없습니다. 당신은, 그러나, 당신은 데이터 집합을 검색 한 후 이름을 설정 한 다음 다음부터 사용할 수 있습니다.

    ds.Tables[0].TableName = "NametbA";
    
  2. ==============================

    2.저장 프로 시저 :

    저장 프로 시저 :

        select 'tbA','tbB','tbC' 
        select * from tbA
        select * from tbB
        select * from tbC
    

    프런트 엔드 :

           int i = 1;
           foreach (string tablename in dsEmailData.Tables[0].Rows[0][0].ToString().Split(','))
           {
               dsEmailData.Tables[i++].TableName = tablename;
           }
    

    도움이 되었기를 바랍니다

  3. ==============================

    3.당신이 데이터 집합을 충전 한 후이를 수동으로 이름을 수없는 이유가 있나요?

    당신이 데이터 집합을 충전 한 후이를 수동으로 이름을 수없는 이유가 있나요?

    mySqlDataAdapter.Fill(ds);
    ds.Tables[0].TableName = "NametbA";
    ds.Tables[1].TableName = "NametbB";
    

    내가 저장 프로 시저에서 여러 결과 집합의 일부로 반환되는 DataTables 이름을 수있는 방법을 알고하지 않습니다,하지만 당신은 저장된 프로 시저가 잘 작동합니다 그들에게 이름을 수동으로 다음 반환 알고있는 경우.

    편집하다

    저장 프로 시저를 제어 할 수 있음을 알고, 하나 개의 대안은 테이블 이름을 나타내는 결과 집합에 열을 추가 할 수 있습니다. 그럼 당신은 뭔가를 할 수 있습니다 :

    foreach (DataTable table in ds.Tables)
    {
        table.TableName = table.Rows[0]["TableName"].ToString();
    }
    

    그러나이 실제로 행을 포함하는 저장 프로 시저에서 돌아 오는 결과 집합에 의존합니다. 그들이 행을 포함하지 않는 경우, 당신은 "만약"문에 포장해야 할 것이 아니라 모든 테이블은 이름을 얻을 것입니다.

  4. ==============================

    4.대신에 테이블 이름을 추가하는 좋은 생각, 그것의 더 나은 프로 시저의 반환은 세 가지 결과 집합

    대신에 테이블 이름을 추가하는 좋은 생각, 그것의 더 나은 프로 시저의 반환은 세 가지 결과 집합

    firs trow of each table
    select 'tbA' FirstTableName,'tbB' SecondTableName
    select * from tbA
    select * from tbB
    

    매번 당신은 [0]를 선택합니다 테이블 이름을 다음 계속 행을해야합니다 절차를 테이블을 실행

    또 다른 아이디어는 프로 시저의 출력 매개 변수로 테이블 이름을 통과 할 수있다

    Create procedure psfoo (@tb1 varchar(50) output,@tb2 varchar(50) output)
    AS
    set @tb1='tbA'
    set @tb2 'tbB'
    select * from tbA
    select * from tbB
    

    이 방법을 제한하고 선택 변수 경우이 같은 절차를 만들 수 있습니다

    Create procedure psfoo ()
        AS
        select * from tbA
        select * from tbB
    return 'tbA,tbB'
    

    문자열로 분할하여 시저 리턴 값 [] 당신은 ordinally 테이블의 이름을 얻을 수 있습니다

    returnvalue=@returnvaluefromSp.split(new char[]{','});
    string tablenam1=returnvalue[0];
    string tablenam2=returnvalue[1];
    
  5. ==============================

    5.위해서는 데이터 집합의 모든 테이블에 이름을 지정하고, 우리는 SP 또는 T-SQL의 마지막에 하나 개 더 선택 쿼리를 작성해야합니다.

    위해서는 데이터 집합의 모든 테이블에 이름을 지정하고, 우리는 SP 또는 T-SQL의 마지막에 하나 개 더 선택 쿼리를 작성해야합니다.

        lsqry = New System.Text.StringBuilder
    lsqry.AppendLine("select * from Bill_main")
    lsqry.AppendLine("select * from serviceonly")
    lsqry.AppendLine("select * from PendingService")
    lsqry.AppendLine("select * from T_servicebillhd")
    lsqry.AppendLine("select 'Bill_Main','serviceonly','PendingService','T_servicebillhd'")
    
    Using con As New SqlConnection(lsConnection)
        Try
            con.Open()
            Using cmd As SqlCommand = con.CreateCommand
                With cmd
                    .CommandText = lsqry.ToString
                    .CommandType = CommandType.Text
                End With
                Using da As New SqlDataAdapter(cmd)
                    da.Fill(DS)
                End Using
            End Using
    
            For li As Integer = 0 To DS.Tables.Count - 2
                DS.Tables(li).TableName = DS.Tables(DS.Tables.Count - 1).Rows(0).Item(li)
            Next
        Catch ex As Exception
    
        End Try
    End Using
    

    위의 예에서, 내가 대신 SP의 T-SQL 문을 사용하고 있습니다. 어떤에서 내가 4 선택 쿼리를 작성하고 마지막 하나는 해당 테이블의 테이블 이름입니다. 그리고 테이블의 이름이 포함 된 마지막 테이블을 가져오고 TABLENAME 속성을 사용하여 테이블에 할당합니다.

  6. ==============================

    6.내 기업 및 반환 여러 결과 집합에있는 모든 데이터에 액세스 한 저장된 프로 시저가 있습니다. 각 결과 집합 전에 이름의 선택을하는 나에게 많은 의미가 있습니다. 그래서 같이 :

    내 기업 및 반환 여러 결과 집합에있는 모든 데이터에 액세스 한 저장된 프로 시저가 있습니다. 각 결과 집합 전에 이름의 선택을하는 나에게 많은 의미가 있습니다. 그래서 같이 :

    SELECT 'Customers' AS TableName
    SELECT ID, Name FROM dbo.Customer
    SELECT 'Orders' AS TableName
    SELECT ID, Created FROM dbo.[Order]
    

    그런 다음 MyDataSet.Tables 이상 나는 반복 처리, 나는 단지 하나 개의 루프와 직선 정방향 조회 논리가있을 때. 함께 유지하는 마스터 메타 데이터 테이블이 없습니다. 어떤 테이블이 반환되지 않습니다 경우에도 작동합니다. 테이블 데이터가 반환되지 않은 경우, 일치하는 메타 데이터는 나에게 의미가있는 반환되지 않습니다.

    For Each DataTable As DataTable In MyDataSet.Tables
      MyDataSet.Tables(MyDataSet.Tables.IndexOf(DataTable) + 1).TableName = DataTable.Rows(0)("TableName")
    Next
    

    나는 내가 할 수있는 메타 데이터 테이블에 더 많은 열을 추가합니다.

  7. ==============================

    7.나는 이것이 아주 오래된 포스트이지만, 대답에 알고 ... 네, 가능합니다. 단순히 데이터 어댑터 채우기 통화에서 "TABLENAME"를 추가 ..

    나는 이것이 아주 오래된 포스트이지만, 대답에 알고 ... 네, 가능합니다. 단순히 데이터 어댑터 채우기 통화에서 "TABLENAME"를 추가 ..

    MyDataAdapter.Fill(ds, "TableName");  
    

    나는 C #을 사람 해요,하지만 당신은 요점을 파악.

  8. ==============================

    8.나는이 오래된 질문은 알고 있지만 난 그냥 결과 데이터 세트의 인덱스를 통해 반복하지 그래서 오늘 같은 일을 생각했다. 저장 프로 시저가 밖으로 폭탄 것 .NET 코드를 선택하는 순서로 변경하는 경우 때문에.

    나는이 오래된 질문은 알고 있지만 난 그냥 결과 데이터 세트의 인덱스를 통해 반복하지 그래서 오늘 같은 일을 생각했다. 저장 프로 시저가 밖으로 폭탄 것 .NET 코드를 선택하는 순서로 변경하는 경우 때문에.

    나는 테이블 이름으로 결과 집합에 열을 추가하고 열이 테이블에 존재하는지 case 문을 사용하는 솔루션을 함께했다. 내가 주변에 코드를 이동하는 것처럼하지만, 그것은 단지 보였다. 그냥 SQL의 정적을했다. 게다가 당신은 열이 다른 테이블에있는 같은 이름의 어떤이있는 경우. 절름발이...

    myDS.Tables(i).Columns.Contains("TableName")
    
  9. ==============================

    9.당신은 여분의 결과 집합을 반환 할 수있는 이름이 같은 테이블 :

    당신은 여분의 결과 집합을 반환 할 수있는 이름이 같은 테이블 :

    SELECT 'firstTableName' AS tbl
    UNION
    SELECT 'secondTableName' AS tbl
    UNION
    ...
    

    그 첫 번째 결과 집합이 있었다면, 당신은 당신이가는대로 후속 결과 집합의 이름을 사용할 수 있습니다.

  10. ==============================

    10.이것은 나를 위해 작동하지만 예상되는 테이블 이름을 얻기 위해 몇 가지 추가 작업이 필요합니다 :

    이것은 나를 위해 작동하지만 예상되는 테이블 이름을 얻기 위해 몇 가지 추가 작업이 필요합니다 :

        Dim tableCount As Integer = 3
        Dim tables(tableCount) As DataTable
        tables(0) = (New DataTable("Employee"))
        tables(1) = (New DataTable("Manager"))
        tables(2) = (New DataTable("Department"))
        dsUControlData.Tables.Add(tables(0))
        dsUControlData.Tables.Add(tables(1))
        dsUControlData.Tables.Add(tables(2))
    
        'Fill required tables
        da.Fill(0, 0, tables)
    
        Return dsUControlData
    
  11. ==============================

    11.이 시도 할 수 있습니다 :

    이 시도 할 수 있습니다 :

    프로 시저에 선 아래 추가

    Select 'TableName1','TableName2';
    

    C #을 사용 :

    for (var i=0;i<ds.Tables[0].Columns.Count;i++)
     {
        ds.Tables[i + 1].TableName = ds.Tables[0].Columns[i].ColumnName;
    
      }
    
  12. ==============================

    12.이 시도

    이 시도

    YourDataAdapter.Fill(ds, "Table");
    
  13. ==============================

    13.이 시도. MS SQL 2008 R2, 나는 항상이를 사용합니다.

    이 시도. MS SQL 2008 R2, 나는 항상이를 사용합니다.

    mySqlDataAdapter.Fill(ds,"NameTableA");
    
  14. ==============================

    14.로 사용을 선택해야한다 "yourtablename는"originaltable에서,이 문에 선택의 올바른 구문을 찾을 수 있습니다, 단지 예입니다.

    로 사용을 선택해야한다 "yourtablename는"originaltable에서,이 문에 선택의 올바른 구문을 찾을 수 있습니다, 단지 예입니다.

    이 귀하의 요구 사항을 위해 할 수있는 올바른 방법입니다. 감사합니다.

  15. ==============================

    15.이 질문은 도니는 다르게, 그것은 구글 검색 상단의 오래된 일이지만. 아마 누군가 도움이 될 것입니다 ...

    이 질문은 도니는 다르게, 그것은 구글 검색 상단의 오래된 일이지만. 아마 누군가 도움이 될 것입니다 ...

    그 대답은 당신이 이름으로 데이터 세트에서 DataTable에 액세스 할 수 있도록 코드에서 테이블의 이름을 지정하는 것이 가능하다, 예입니다.

    작품을 TableMapping 방법 첫째, 내가 설명해야합니다. 우리는 기본적으로 첫 번째 테이블에 의해 다음 (우리의 데이터 집합을 채울 것입니다 SqlDataAdapter를) SqlDataAdapter를 가진 TableMappings를 지정하지 않은 경우 등 세 번째는 "표 2"라는 것, 두 번째 "표"라는 것, "표"라는 것

    우리는 데이터 집합의 DataTable의 이름을 지정할 때, 우리는 다음과 같이 사용 :

    //...
    
    System.Data.DataSet myDataSet = new System.Data.DataSet();
    
    using (System.Data.SqlClient.SqlDataAdapter dbAdapter = new System.Data.SqlClient.SqlDataAdapter(dbCommand))
    {
        dbAdapter.TableMappings.Add("Table", "MyFirstTitleForTableOne");
        dbAdapter.TableMappings.Add("Table1", "MyFirstTitleForTableTwo");
        dbAdapter.TableMappings.Add("Table2", "MyFirstTitleForTableThree");
        dbAdapter.TableMappings.Add("Table3", "MyFirstTitleForTableFour");
            //...
    
        dbAdapter.Fill(myDataSet);
    }
    
    //...
    

    그리고 지금 우리는 우리의 제목으로 DataTable에 액세스 할 수 있습니다 :

    System.Data.DataTable firstTable = myDataSet.Tables["MyFirstTitleForTableOne"];
    System.Data.DataTable secondTable = myDataSet.Tables["MyFirstTitleForTableTwo"];
    

    죄송합니다,하지만 난 널 (MyDataSet로) 확인 또는 내가 그이 질문에 무관하지 않다 생각하기 때문에 try / catch 블록에서 설정합니다 쓰기 코드는하지 않았다.

  16. ==============================

    16.이 될 수있다 작업 주위에있을 수

    이 될 수있다 작업 주위에있을 수

     Create procedure psfoo ()
     AS
     select * ,'tbA' as TableName from tbA
     select * ,'tbB' as TableName from tbB
    

    그런 다음 C # 코드에서

         foreach (DataTable dt in ds.Tables)
            {
                if (dt.Rows[0]["TableName"].ToString().Contains("tbA"))
                {
    
                }
                else if (dt.Rows[0]["TableName"].ToString().Contains("tbB"))
                {
    
                }
            }
    
  17. from https://stackoverflow.com/questions/589976/how-can-you-name-the-datasets-tables-you-return-in-a-stored-proc by cc-by-sa and MIT license