Sql server 如何使用T-SQL链接服务器获取列的MS Access数据字典信息
好的,我已经通过一个链接的服务器对象成功地将MS Access链接到SQL Server 2012,并且可以很好地查询数据库。这个MS Access数据库是由政府发布的,有时他们会修改模式 我的目标是创建一个T-SQL存储过程,它可以复制MS Access表/列元数据,并将其与以前的版本进行比较,以便在发生架构更改时向我发出警报 我尝试过使用sp_columns_ex和sp_tables_ex-sp_tables_ex工作正常,但是sp_columns_ex没有返回任何结果 我尝试过使用不同参数数组的sp_columns_ex,以防万一。。。它不会出错,只返回0条记录Sql server 如何使用T-SQL链接服务器获取列的MS Access数据字典信息,sql-server,tsql,ms-access,Sql Server,Tsql,Ms Access,好的,我已经通过一个链接的服务器对象成功地将MS Access链接到SQL Server 2012,并且可以很好地查询数据库。这个MS Access数据库是由政府发布的,有时他们会修改模式 我的目标是创建一个T-SQL存储过程,它可以复制MS Access表/列元数据,并将其与以前的版本进行比较,以便在发生架构更改时向我发出警报 我尝试过使用sp_columns_ex和sp_tables_ex-sp_tables_ex工作正常,但是sp_columns_ex没有返回任何结果 我尝试过使用不同参数
如有任何帮助/想法,将不胜感激 这根本不是我首选的解决方案,但由于sp_tables_ex可以工作,我可以循环表名列表并生成select Into语句来创建/复制本地sql server表,从而复制表。然后我就可以使用sql server自带的数据字典信息来完成其余的工作 如果我不必这样做,并且可以依靠sp_列_ex。。。但这是一条代替更好的道路
蒂姆比如:
SELECT TOP 1 *
INTO #temp
FROM [HCDB_CURRENT]..[dbo_vwHQI_FTNT]
SELECT name FROM tempdb.sys.columns
WHERE OBJECT_ID = OBJECT_ID('tempdb..#temp');
DROP TABLE #temp;
我知道这有点不方便,但您不必使用存储的进程。MS Access有描述元数据的系统表,就像SQL Server中的sys.columns一样 您能否通过链接服务器从
MSysObjects
中进行选择(尝试所有方法-OPENQUERY
,OPENDATASOURCE
,OPENROWSET
,四部分名称)
此链接表示您需要授予管理员用户访问权限:
它说:
如果您定期获取此数据库的新副本,这可能会很烦人。你也许可以把它自动化。无论如何,验证它不会有什么坏处。如上所述,由于访问表是链接的,因此如果修改了相关表,例如添加了其他列,它们将不会显示在链接表中。(您必须重新链接) 因此,我们需要从服务器端和链接表端获取列。使用SQL server,我们可以使用此命令获取列:
SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS
WHERE Table_Name = 'faxbook'
因此,上述操作将返回服务器端表中的所有列,甚至在添加字段时也会返回
但是,我们不需要上述内容。简单地从服务器端抓取字段集合,并从列表端抓取字段集合
因此,请保存访问传递查询:
Select * from Faxbook where 1 = 2
现在,在VBA中,我们可以执行以下操作:
函数TableChanged()为布尔值
Dim rstServer As DAO.Recordset
Dim rstLinked As DAO.Recordset
Dim f As DAO.Field
Dim MyBol As Boolean
Set rstServer = CurrentDb.QueryDefs("qPass").OpenRecordset
Set rstLinked = CurrentDb.OpenRecordset("select * from dbo_FaxBook where 1 = 2", _
dbOpenDynaset, dbSeeChanges)
TableChanged = False
If rstServer.Fields.Count <> rstLinked.Fields.Count Then
' field count is differnt
TableChanged = True
Exit Function
Else
' field count is same, check for field name change
On Error Resume Next
For Each f In rstLinked.Fields
MyBol = (f.Name = rstServer.Fields(f.Name).Name)
' an error will occur if field name is differnt
If Err.Number <> 0 Then
TableChanged = True
Exit Function
End If
Next f
End If
End Function
您是否从系统列中得到任何结果。。。我没有从表中的链接服务器得到任何东西。谢谢你的提问..可能重复的是sp表在t-SQL中工作良好…是的,请参阅上面我的解决方法。。。这正是我最后要做的,我现在明白了。错过了,给了同样的荣誉。我也来过同样的工作环境。但我很高兴他考虑了一下,也找到了一个很好的解决办法。我很高兴你去了,因为我也试过了。。。它可以查询所有系统表,但最重要的一个Msysobjects表除外,Msysobjects表在运行时失败。
If TableChanged() = True then
Call RelinkOneTable('dbo_Faxbook')
End if