복붙노트

[SQL] 합니까 MS 액세스 (2003) 저장 프로 시저에 비해 아무것도. 나는 MS의 acceess에서 복잡한 쿼리를 실행하려면

SQL

합니까 MS 액세스 (2003) 저장 프로 시저에 비해 아무것도. 나는 MS의 acceess에서 복잡한 쿼리를 실행하려면

나는 테이블이 TBL를 호출합니다. 내가 TBL에 반대하는 모든 B 년대의 쉼표 seprated 목록이어야합니다 A와 다른 열 등 한 열을 필요로하는 쿼리에서 A와 B 지금 그들에게 전화, 두 개의 열이 있습니다. 예를 들면 TBL이 같다

1 알파

2 베타

1 감마

1 델타

쿼리의 결과이어야한다

1 알파, 감마, 델타

2 베타

일의이 유형은 저장 프로 시저에서 커서 작업을 아주 쉽게 할 수 있습니다. 그러나 나는 분명히이 저장 프로 시저를 지원하지 않기 때문에, MS Access를 통해 그것을 할 수 없습니다입니다. MS 액세스에서 저장 프로 시저를 실행하는 방법이 있나요? 또는 이러한 유형의 쿼리를 실행하는 SQL을 통한 방법이있다

해결법

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

    1.당신은 사용자 정의 함수 (UDF)와 레코드를 연결할 수 있습니다.

    당신은 사용자 정의 함수 (UDF)와 레코드를 연결할 수 있습니다.

    아래에 붙여 넣을 수 있습니다 코드는 표준 모듈에 '있는 그대로'. 당신이 예를 들어 SQL은 다음과 같습니다

    SELECT tbl.A, Concatenate("SELECT B  FROM tbl
            WHERE A = " & [A]) AS ConcA
    FROM tbl
    GROUP BY tbl.A
    

    이 코드는 DHookom, 액세스 MVP에 의해, 그리고 http://www.tek-tips.com/faqs.cfm?fid=4233에서 가져옵니다

    Function Concatenate(pstrSQL As String, _
            Optional pstrDelim As String = ", ") _
                As String
        'example
        'tblFamily with FamID as numeric primary key
        'tblFamMem with FamID, FirstName, DOB,...
        'return a comma separated list of FirstNames
        'for a FamID
        '    John, Mary, Susan
        'in a Query
        '(This SQL statement assumes FamID is numeric)
        '===================================
        'SELECT FamID,
        'Concatenate("SELECT FirstName FROM tblFamMem
        '     WHERE FamID =" & [FamID]) as FirstNames
        'FROM tblFamily
        '===================================
        '
        'If the FamID is a string then the SQL would be
        '===================================
        'SELECT FamID,
        'Concatenate("SELECT FirstName FROM tblFamMem
        '     WHERE FamID =""" & [FamID] & """") as FirstNames
        'FROM tblFamily
        '===================================
    
        '======For DAO uncomment next 4 lines=======
        '======     comment out ADO below    =======
        'Dim db As DAO.Database
        'Dim rs As DAO.Recordset
        'Set db = CurrentDb
        'Set rs = db.OpenRecordset(pstrSQL)
    
        '======For ADO uncomment next two lines=====
        '======     comment out DAO above     ======
        Dim rs As New ADODB.Recordset
        rs.Open pstrSQL, CurrentProject.Connection, _
                adOpenKeyset, adLockOptimistic
        Dim strConcat As String 'build return string
        With rs
            If Not .EOF Then
                .MoveFirst
                Do While Not .EOF
                    strConcat = strConcat & _
                        .Fields(0) & pstrDelim
                    .MoveNext
                Loop
            End If
            .Close
        End With
        Set rs = Nothing
        '====== uncomment next line for DAO ========
        'Set db = Nothing
        If Len(strConcat) > 0 Then
            strConcat = Left(strConcat, _
                Len(strConcat) - Len(pstrDelim))
        End If
        Concatenate = strConcat
    End Function 
    
  2. ==============================

    2.난 당신이 VBA 기능을 만들 수 있다고 생각하고 액세스 쿼리를 사용합니다. 그것은 당신을 도움이 될 수 있습니다.

    난 당신이 VBA 기능을 만들 수 있다고 생각하고 액세스 쿼리를 사용합니다. 그것은 당신을 도움이 될 수 있습니다.

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

    3.내가 Access 데이터베이스에서 실행 저장 프로 시저 알고있는 방법이 없습니다. 그것이 SQL 백엔드에 대해 사용되는 경우, 액세스 저장 프로 시저를 실행할 수 있습니다. 당신은 SQL에 대한 액세스 및 데이터에 대한 UI를 분할 할 수없는 경우, 가장 좋은 건 아마 당신에게 필요한 출력을 제공하기 위해 VBA 모듈 코드에있을 것입니다.

    내가 Access 데이터베이스에서 실행 저장 프로 시저 알고있는 방법이 없습니다. 그것이 SQL 백엔드에 대해 사용되는 경우, 액세스 저장 프로 시저를 실행할 수 있습니다. 당신은 SQL에 대한 액세스 및 데이터에 대한 UI를 분할 할 수없는 경우, 가장 좋은 건 아마 당신에게 필요한 출력을 제공하기 위해 VBA 모듈 코드에있을 것입니다.

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

    4.당신의 작업을 수행하려면 코드를 사용해야합니다. 다음과 같이 하나의 솔루션으로,보다 의미있는 이름을 사용한다 :

    당신의 작업을 수행하려면 코드를 사용해야합니다. 다음과 같이 하나의 솔루션으로,보다 의미있는 이름을 사용한다 :

    이 적용되는 열이 기본 테이블 :

    두 개의 열을 가진 테이블을 추가 :

    ColorListByWidget 테이블을 업데이트 할 필요에 따라 모듈과 호출에 다음 코드를 추가합니다 :

    Public Sub GenerateColorList()
    
    Dim cn As New ADODB.Connection
    Dim Widgets As New ADODB.Recordset
    Dim ColorListByWidget As New ADODB.Recordset
    Dim ColorList As String
    
    Set cn = CurrentProject.Connection
    
    cn.Execute "DELETE * FROM ColorListByWidget"
    cn.Execute "INSERT INTO ColorListByWidget (ID) SELECT ID FROM Widgets GROUP BY ID"
    
    With ColorListByWidget
       .Open "ColorListByWidget", cn, adOpenForwardOnly, adLockOptimistic, adCmdTable
       If Not (.BOF And .EOF) Then
          .MoveFirst
          Do Until .EOF
             Widgets.Open "SELECT Color FROM Widgets WHERE ID = " & .Fields("ID"), cn
             If Not (.BOF And .EOF) Then
                Widgets.MoveFirst
                ColorList = ""
                Do Until Widgets.EOF
                   ColorList = ColorList & Widgets.Fields("Color").Value & ", "
                   Widgets.MoveNext
                Loop
             End If
             .Fields("ColorList") = Left$(ColorList, Len(ColorList) - 2)
             .MoveNext
             Widgets.Close
          Loop
       End If
    End With
    
    
    End Sub
    

    ColorListByWidget 표는 이제 원하는 정보가 포함되어 있습니다. 목록 (이 예에서는 색) 255자를 초과하지 않도록주의하십시오.

  5. ==============================

    5.어떤 절차없이 임시 테이블을 저장하지 않습니다.

    어떤 절차없이 임시 테이블을 저장하지 않습니다.

    당신이 레코드로 쿼리를 반환하기 위해 필요한 경우, 연결이 끊긴 된 레코드를 사용할 수 있습니다.

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

    6.아마도 대신 제트 저장 프로 시저를 한 경우, 당신은 당신이 달성하기 위해 원하는 것을 설명해야하고 우리는 당신이 응용 프로그램에 대한 액세스를 사용하거나 제트 MDB 등을 사용하는 경우는 분명하지 않다 (제트로 작업을 수행하는 방법을 설명 할 수 묻는 데이터 저장소).

    아마도 대신 제트 저장 프로 시저를 한 경우, 당신은 당신이 달성하기 위해 원하는 것을 설명해야하고 우리는 당신이 응용 프로그램에 대한 액세스를 사용하거나 제트 MDB 등을 사용하는 경우는 분명하지 않다 (제트로 작업을 수행하는 방법을 설명 할 수 묻는 데이터 저장소).

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

    7.글쎄, 당신은 당신이 필요로하는 어떤 기준에 따라 필드 값을 연결, VBA에서 쿼리를 통해 루프 Recordset 개체를 사용할 수 있습니다.

    글쎄, 당신은 당신이 필요로하는 어떤 기준에 따라 필드 값을 연결, VBA에서 쿼리를 통해 루프 Recordset 개체를 사용할 수 있습니다.

    당신이 문자열로 결과를 반환하려는 경우, 당신은 괜찮을거야. 쿼리로를 반환 할 경우에, 그것은 더 복잡 할 것입니다. 당신은 당신이 테이블이나 쿼리로 반환 할 수 있도록 거기에 결과를 임시 테이블을 생성하고 저장해야 할 수도 있습니다.

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

    8.당신은 어떤 가치와 같은 당신에 의해 분리 된 레코드 집합을 반환하는 VBA로하여 GetString을 사용할 수 있습니다 (예를 들어, 쉼표, 대시, 테이블 셀 등) 나는 단지, 비주얼없는 기본 VBScript로 사용했습니다 인정해야하지만. W3 스쿨 희망 여러분의 필요에 자체 빌려 것이다 좋은 자습서를 가지고있다.

    당신은 어떤 가치와 같은 당신에 의해 분리 된 레코드 집합을 반환하는 VBA로하여 GetString을 사용할 수 있습니다 (예를 들어, 쉼표, 대시, 테이블 셀 등) 나는 단지, 비주얼없는 기본 VBScript로 사용했습니다 인정해야하지만. W3 스쿨 희망 여러분의 필요에 자체 빌려 것이다 좋은 자습서를 가지고있다.

  9. ==============================

    9.당신은 텍스트로 저장 프로 시저를 작성하고 데이터베이스에 보낼 수 있습니다 :

    당신은 텍스트로 저장 프로 시저를 작성하고 데이터베이스에 보낼 수 있습니다 :

    Dim sp as string
    sp = "your stored procedure here" (you can load it from a text file or a memo field?)
    
    Access.CurrentProject.AccessConnection.Execute sp
    

    당신이 ADODB 개체를 사용하는이 가정한다 (액티브 데이터 coorectly 앱에서 참조되는 개체 라이브러리).

    나는 DAO와 비슷한이 확신 ...

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

    10.@Remou DHookom의 CONCATENATE 기능에 :도 표준 SQL이나 제트가 CONCATENATE () 설정 기능이 있습니다. 단순히 1NF에 위배되기 때문이다 넣어. 나는 그것이 할 수 있도록 설계되지 않았습니다 뭔가를 힘 SQL에 응용 프로그램 측면보다는 시도에서이 작업을 수행하는 것을 선호 것입니다. 아마도 ACE의 (Access2007) 다중 값 유형이 더 적합하다 : 아직 NFNF하지만 적어도 엔진 수준의 지원이있다. 문제는 저장된 객체에 관한 기억 : 어떻게 할 사용자 쿼리 SQL을 사용하여 비 스칼라 열 ...?

    @Remou DHookom의 CONCATENATE 기능에 :도 표준 SQL이나 제트가 CONCATENATE () 설정 기능이 있습니다. 단순히 1NF에 위배되기 때문이다 넣어. 나는 그것이 할 수 있도록 설계되지 않았습니다 뭔가를 힘 SQL에 응용 프로그램 측면보다는 시도에서이 작업을 수행하는 것을 선호 것입니다. 아마도 ACE의 (Access2007) 다중 값 유형이 더 적합하다 : 아직 NFNF하지만 적어도 엔진 수준의 지원이있다. 문제는 저장된 객체에 관한 기억 : 어떻게 할 사용자 쿼리 SQL을 사용하여 비 스칼라 열 ...?

    제트 저장 여부 절차에 대한 @ 데이비드 W. 펜톤 : 당신과 나는 몇 년 전에 뉴스 그룹에서이 문제를 논의하지 않았다. 버전 4.0 이후, 제트 / ACE가 지원 한 ANSI-92 쿼리 모드에서 다음 구문 :

    CREATE PROCEDURE procedure (param1 datatype[, param2 datatype][, ...]) AS sqlstatement;
    
    EXECUTE procedure [param1[, param2[, ...]];
    

    제트 생성 및 MDB 파일에 '저장'하는 '과정'으로 (적어도 하나 개의 모드에서) 그것을 알고 뭔가를 실행하고 그래서. 그러나, 제트 / ACE SQL은 순수하고 간단하다 : 그것은 어떤 흐름 제어 구문이 없으며 어떤 절차 적 코드는 질문을 밖으로 있도록 절차는 하나의 SQL 문을 포함 할 수 있습니다. 따라서, 여부 제트가 저장 한 절차에 대한 대답은 주관적이다.

  11. from https://stackoverflow.com/questions/230241/does-ms-access2003-have-anything-comparable-to-stored-procedure-i-want-to-run by cc-by-sa and MIT license