[SQL] 액세스 테이블이 존재하는지 확인
SQL액세스 테이블이 존재하는지 확인
나는 액세스 데이터베이스에 웹 사이트 방문 'IP, 날짜, 클라이언트와 refferer 데이터를 기록 할하지만 2010년 6월 6일이 2010_06_06라는 이름의 테이블에 기록됩니다에 대한 모든 일이 예를 로그에 별도의 테이블의 데이터를 기록 로그온 할 계획입니다. 날짜가 변경되면 나는 2010_06_07라는 이름의 테이블을 만듭니다. 이 테이블은 이미 생성 된 경우 그러나 문제는있다.
테이블 액세스에 존재하는 경우 모든 제안을 확인하는 방법?
해결법
-
==============================
1.테이블이 존재하는 경우 확인 숨겨진 시스템 테이블으로 MSysObjects을 사용할 수 있습니다 :
테이블이 존재하는 경우 확인 숨겨진 시스템 테이블으로 MSysObjects을 사용할 수 있습니다 :
If Not IsNull(DlookUp("Name","MSysObjects","Name='TableName'")) Then 'Table Exists
그러나, 나는 매일 새 테이블을 만드는 아주 나쁜 생각에 동의합니다.
편집 : 나는 테이블이 유형 1, 4, 6을하고 말을 더 나은 것 그래서, 테이블과 같은 이름을 가지고 다른 유형의 다른 개체에 대한 수 있음을 추가해야합니다 :
If Not IsNull(DlookUp("Name","MSysObjects","Name='TableName' And Type In (1,4,6)")) Then 'Table Exists
그러나, 당신이 이름에 대한 테스트까지 살펴 필요 그렇다면, 쿼리와 같은 이름의 테이블을 만들 수 없습니다, 그것은 형식 목록을 쿼리입니다, 5를 추가하는 것이 가장 좋습니다.
-
==============================
2.나는 테이블이 몇 년 전에 존재하는지 알아 내기 위해 다양한 방법을 시험했다. 여기 내 간단한 테스트 루틴을 포함하여 구현 된 그들 모두를위한 코드입니다.
나는 테이블이 몇 년 전에 존재하는지 알아 내기 위해 다양한 방법을 시험했다. 여기 내 간단한 테스트 루틴을 포함하여 구현 된 그들 모두를위한 코드입니다.
Public Function TableExists(strTableName As String, Optional ysnRefresh As Boolean, Optional db As DAO.Database) As Boolean ' Originally Based on Tony Toews function in TempTables.MDB, http://www.granite.ab.ca/access/temptables.htm ' Based on testing, when passed an existing database variable, this is the fastest On Error GoTo errHandler Dim tdf As DAO.TableDef If db Is Nothing Then Set db = CurrentDb() If ysnRefresh Then db.TableDefs.Refresh Set tdf = db(strTableName) TableExists = True exitRoutine: Set tdf = Nothing Exit Function errHandler: Select Case Err.Number Case 3265 TableExists = False Case Else MsgBox Err.Number & ": " & Err.Description, vbCritical, "Error in mdlBackup.TableExists()" End Select Resume exitRoutine End Function Public Function TableExists2(strTableName As String, Optional ysnRefresh As Boolean, Optional db As DAO.Database) As Boolean On Error GoTo errHandler Dim bolCleanupDB As Boolean Dim tdf As DAO.TableDef If db Is Nothing Then Set db = CurrentDb() bolCleanupDB = True End If If ysnRefresh Then db.TableDefs.Refresh For Each tdf In db.TableDefs If tdf.name = strTableName Then TableExists2 = True Exit For End If Next tdf exitRoutine: Set tdf = Nothing If bolCleanupDB Then Set db = Nothing End If Exit Function errHandler: MsgBox Err.Number & ": " & Err.Description, vbCritical, "Error in mdlBackup.TableExists1()" Resume exitRoutine End Function Public Function TableExists3(strTableName As String, _ Optional db As DAO.Database) As Boolean ' Based on testing, when NOT passed an existing database variable, this is the fastest On Error GoTo errHandler Dim strSQL As String Dim rs As DAO.Recordset If db Is Nothing Then Set db = CurrentDb() strSQL = "SELECT MSysObjects.Name FROM MSysObjects " strSQL = strSQL & "WHERE MSysObjects.Name=" & Chr(34) & strTableName & Chr(34) strSQL = strSQL & " AND MSysObjects.Type=6;" Set rs = db.OpenRecordset(strSQL) TableExists3 = (rs.RecordCount <> 0) exitRoutine: If Not (rs Is Nothing) Then rs.Close Set rs = Nothing End If Exit Function errHandler: MsgBox Err.Number & ": " & Err.Description, vbCritical, _ "Error in TableExists1()" Resume exitRoutine End Function Public Sub TestTableExists(strTableName As String, intLoopCount As Integer) Dim dteStart As Date Dim i As Integer Dim bolResults As Boolean dteStart = Now() For i = 0 To intLoopCount bolResults = TableExists(strTableName, , CurrentDB()) Next i Debug.Print "TableExists (" & intLoopCount & "): " & Format(Now() - dteStart, "nn:ss") dteStart = Now() For i = 0 To intLoopCount bolResults = TableExists2(strTableName, , CurrentDB()) Next i Debug.Print "TableExists2 (" & intLoopCount & "): " & Format(Now() - dteStart, "nn:ss") dteStart = Now() For i = 0 To intLoopCount bolResults = TableExists3(strTableName, CurrentDB()) Next i Debug.Print "TableExists3 (" & intLoopCount & "): " & Format(Now() - dteStart, "nn:ss") End Sub
-
==============================
3.여기에 또 다른 솔루션입니다, 모든 테이블을 통해 반복보다 조금 빠를 것이다.
여기에 또 다른 솔루션입니다, 모든 테이블을 통해 반복보다 조금 빠를 것이다.
Public Function doesTableExist(strTableName As String) As Boolean Dim db As DAO.Database Dim td As DAO.TableDef Set db = CurrentDb On Error Resume Next Set td = db.TableDefs(strTableName) doesTableExist = (Err.Number = 0) Err.Clear End Function
-
==============================
4.나는 신뢰할 수와 테이블을 정기적으로 작성 떨어받을 경우 스크립트에서 예기치 않은 동작을 소개하는 질의 시스템 테이블 또는의 TableDefs을 발견했다.
나는 신뢰할 수와 테이블을 정기적으로 작성 떨어받을 경우 스크립트에서 예기치 않은 동작을 소개하는 질의 시스템 테이블 또는의 TableDefs을 발견했다.
내 결과를 바탕으로, 내 가설은 이러한 테이블은 반드시이 CREATE 정확한 순간에 업데이트되지 않습니다 또는 DROP이 실행될 때, 또는 동시성 문제는 정확한 결과를 얻기에서 저를 방지하는 것입니다.
나는 다음과 같은 방법이 더 신뢰할 수 발견했습니다 :
Public Function TableExists(theDatabase As Access.Application, _ tableName As String) As Boolean ' Presume that table does not exist. TableExists = False ' Define iterator to query the object model. Dim iTable As Integer ' Loop through object catalogue and compare with search term. For iTable = 0 To theDatabase.CurrentData.AllTables.Count - 1 If theDatabase.CurrentData.AllTables(iTable).Name = tableName Then TableExists = True Exit Function End If Next iTable End Function
테이블의 비틀 거리며 거대한 컬렉션이하지 않는 한 런타임 문제를 반복하는이 없어야합니다.
-
==============================
5.이 질문은 꽤 오래 그러나 나는 아무 대답이 때문에, 만족되지 않는 것을 발견 :
이 질문은 꽤 오래 그러나 나는 아무 대답이 때문에, 만족되지 않는 것을 발견 :
그래서 여기 내 간단하지만보다 완벽한 솔루션입니다 :
Function isTableOk(tblName As String) As Boolean 'works with local or linked tables Dim db As DAO.Database, rs As DAO.Recordset Dim sSql As String sSql = "SELECT TOP 1 ""xxx"" AS Expr1 FROM [" & tblName & "]" On Error Resume Next Err.Clear Set db = CurrentDb Set rs = db.OpenRecordset(sSql) isTableOk = (Err.Number = 0) rs.Close End Function
이 버전의 외부 액세스 DB에 테이블을 확인조차 할 수 있습니다 :
Function isTableOk(tblName As String, Optional dbName As String) As Boolean 'works with local or linked tables, or even tables in external db (if dbName is provided) Dim db As DAO.Database, rs As DAO.Recordset Dim sSql As String Set db = CurrentDb sSql = "SELECT TOP 1 'xxx' AS Expr1 FROM [" & tblName & "]" If Len(dbName) > 0 Then 'external db sSql = sSql & " IN '" & dbName & "'" End If Err.Clear On Error Resume Next Set rs = db.OpenRecordset(sSql) isTableOk = (Err.Number = 0) rs.Close End Function
from https://stackoverflow.com/questions/2985513/check-if-access-table-exists by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 프로그래밍 / 동적 SQL에 WHERE 절을 추가 (0) | 2020.05.14 |
---|---|
[SQL] 행되지 존재하는 경우 삽입 신탁 (0) | 2020.05.14 |
[SQL] IN의 배열 () 절 오라클 PLSQL (0) | 2020.05.14 |
[SQL] 어떻게 PostgreSQL의 행의 최대 수에 관한 제약 조건을 작성하는? (0) | 2020.05.14 |
[SQL] SQL을 사용하여 날짜 범위를 생성 (0) | 2020.05.14 |