【发布时间】:2008-12-22 14:03:07
【问题描述】:
我有一个包含许多表的访问数据库。我正在寻找一个可能存在也可能不存在于一个或多个表中的字段。如何检查它是否存在? (当然不用查询每张表)
【问题讨论】:
我有一个包含许多表的访问数据库。我正在寻找一个可能存在也可能不存在于一个或多个表中的字段。如何检查它是否存在? (当然不用查询每张表)
【问题讨论】:
字段有一个模式:
Set cn = CurrentProject.Connection
SelectFieldName = "SomeFieldName"
'Get names of all tables that have a column = SelectFieldName '
Set rs = cn.OpenSchema(adSchemaColumns, _
Array(Empty, Empty, Empty, SelectFieldName))
【讨论】:
如果您真的不想打开任何表,一个解决方案是使用数据库对象的tabledefs 集合。每个tabledef 项目都有自己的fields 集合供您浏览。它会给出这样的结果:
Public function findFieldInDatabase(p_myFieldName)
dim db as database, _
tb as tabledef, _
fd as field
set db = currentDb
for each tb in db.tabledefs
for each fd in tb.fields
if fd.name = p_myFieldName then
debug.print tb.name, fd.name
end if
next fd
next tb
set fd = nothing
set tb = nothing
set db = nothing
end function
这个代码可以很容易地接受一个可选的p_myTableName作为参数来限制搜索到一个表/表范围。
【讨论】:
如果我想查看特定表中的特定列(在 strSearch 中标识)是否存在,我会这样做。
Public Sub search()
Dim db As Database
Dim strSearch As String
Dim strSQL As String
Dim rsResults As Recordset
Dim i As Integer
Dim cols As Integer
strSearch = "a3"
Set db = CurrentDb
strSQL = "select * from bar"
Set rsResults = db.OpenRecordset(strSQL, dbOpenDynaset, dbReadOnly)
If Not rsResults.BOF Then
rsResults.MoveFirst
End If
cols = rsResults.Fields.Count - 1 ' -1 because we start counting cols at 0
For i = 0 To cols
If rsResults(i).Name = strSearch Then
MsgBox "Found the seach string"
End If
Next
MsgBox "end of script"
End Sub
现在我知道你不想为每张桌子写一个。所以接下来要做的就是遍历所有的表。您可以使用以下 SQL 找到所有表的列表
SELECT
name
FROM
MSysObjects
WHERE
(Left([Name],1)<>"~")
AND (Left([Name],4) <> "MSys")
AND ([Type] In (1, 4, 6))
将这两部分连接在一起,我将留给学生作为练习:)
【讨论】:
以下是在 MS Access 中使用 VBScript 访问表架构的方法:
TestData = "PROVIDER=Microsoft.Jet.OLEDB.4.0;Data Source=c:\somefolder\YOURDB.mdb"
Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open TestData
Set rs = Conn.OpenSchema(4)
do until Rs.eof
tn = RS("TABLE_NAME")
fn = RS("COLUMN_NAME")
' your script goes here
loop
【讨论】:
给你:
Public Function fTableExists(ByVal vstrTable As String) As Boolean
Dim rs As ADODB.Recordset
Set rs = CurrentProject.Connection.OpenSchema( _
adschematables, Array(Empty, Empty, vstrTable))
fTableExists = Not rs.EOF
rs.Close
Set rs = Nothing
End Function
Public Function fColumnExists(ByVal vstrTable As String, _
ByVal vstrColumn As String) As Boolean
Dim rs As ADODB.Recordset
Set rs = CurrentProject.Connection.OpenSchema(adSchemaColumns, _
Array(Empty, Empty, vstrTable, vstrColumn))
fColumnExists = Not rs.EOF
rs.Close
Set rs = Nothing
End Function
【讨论】:
MSSQL 寻找 ADDRESS1 列: 从 sysobjects 中选择 so.name 所以 where so.id in (select sc.id from syscolumns sc where name like 'ADDRESS1')
甲骨文 http://en.wikipedia.org/wiki/Oracle_metadata
Google 会找到其他数据库的语法...
【讨论】:
它是什么类型的数据库?如果是 SQL Server,你可以试试这个:
SELECT * FROM sysobjects WHERE xtype = 'U' AND name = 'myTable'
但由于它是您要查找的列而不是表(感谢 Brian),请尝试以下操作:
SELECT
DISTINCT
so.[name] AS 'Table',
sc.[name] AS 'Column'
FROM
syscolumns sc
JOIN
sysobjects so
ON
so.id = sc.id
WHERE
sc.[name] = 'myTable'
【讨论】: