Sql server 如何使用T-SQL链接服务器获取列的MS Access数据字典信息

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没有返回任何结果 我尝试过使用不同参数

好的,我已经通过一个链接的服务器对象成功地将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条记录

  • Works-sp_tables_ex@table_server='HCDB_CURRENT'
  • 不工作-exec sp_columns_ex@table_server='HCDB_CURRENT'
  • 不工作-exec sp_columns_ex@table_server='HCDB_CURRENT',@table_name='dbo_vwHQI_FTNT'

  • 如有任何帮助/想法,将不胜感激

    这根本不是我首选的解决方案,但由于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
    ,四部分名称)

    此链接表示您需要授予管理员用户访问权限:

    它说:

  • 按工具、安全、用户和组权限显示“用户和组权限”对话框
  • 在对象名称列表中选择MSysObjects表,并授予管理员用户读取数据的权限

  • 如果您定期获取此数据库的新副本,这可能会很烦人。你也许可以把它自动化。无论如何,验证它不会有什么坏处。

    如上所述,由于访问表是链接的,因此如果修改了相关表,例如添加了其他列,它们将不会显示在链接表中。(您必须重新链接)

    因此,我们需要从服务器端和链接表端获取列。使用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