【问题标题】:"'PK_dbo.TableName' is not a valid name" with Access ODBC linked table to SQL Server“'PK_dbo.TableName' 不是有效名称”,Access ODBC 链接表到 SQL Server
【发布时间】:2011-02-02 03:44:05
【问题描述】:

我正在尝试使用 ODBC 将 Access 2003 DB 链接到 SQL Server 2008 数据库中的表。当我尝试链接到已建立主键的表时,我收到以下错误消息。

" 'Pk_dbo.Batch_Claims' 不是一个有效的名称。确保它不包含无效字符或标点符号,并且不要太长。"

Pk_dbo.Batch_Claims 是我通过 SSMS 查看表格时看到的关键值。我使用 Access 有一段时间了,但对 SQL Server 和使用 ODBC 的连接有点陌生。任何帮助将不胜感激。

谢谢

【问题讨论】:

  • 听起来您指的是索引,而不是实际字段。您的实际字段名称可能类似于 dbo.Batch_Claims.BatchClaimID
  • Pk_dbo.Batch_Claims 是我在为 SSMS 中的 Batch_Claims 表显示的 KEYS 文件夹中看到的,所以我假设这是该表的索引。当为表识别主键时,SQL Server 不会自动创建它。您可以在不影响主键的情况下删除索引还是它们是同一个?
  • 根据我的经验,ODBC 连接需要一个连接字符串。发布它可能会有所帮助。

标签: ms-access sql-server-2008 odbc ms-access-2003


【解决方案1】:

您需要通过在 SQL Server Management Studio 中打开您的 SQL Server(或 Azure)数据库来重命名主键。请参阅此博客文章中的“解决无效的主键名称”部分:Linking Microsoft Access 2010 Tables to a SQL Azure Database

【讨论】:

  • 这真是太棒了,看看这些是微软在制作 .Net 用户相关表时应用于主键的名称。我喜欢 Microsoft 使用与其他 Microsoft 产品不兼容的名称的方式。
  • 我必须同意@Hill 我的主键是 Code First Entity Framework 创建的......我担心重命名 PK 会破坏我的实体?
  • @AnthonyGriggs 我认为你是对的,你只是不能将 ODBC 与代码首先生成的表一起使用
  • @RobSedgwick 我继续尝试并重命名了它。结果很好。我没有任何问题,现在已经有几个月了,后来有很多迁移/更新。
【解决方案2】:

我已经创建了一个存储过程,可以为您完成这项工作。 首先我们必须删除所有外键,否则我们不能删除主键约束。 改变我们循环到 key drop 并重新创建它们

Create procedure proc_changepk
As

    --first drop all references
    declare @sql nvarchar(max)
    declare cursRef cursor for
        SELECT 
        'ALTER TABLE [' +  OBJECT_SCHEMA_NAME(parent_object_id) +
        '].[' + OBJECT_NAME(parent_object_id) + 
        '] DROP CONSTRAINT [' + name + ']' as ref
        FROM sys.foreign_keys   
    open cursRef
        fetch next from cursRef into @sql
        while @@fetch_status = 0 begin
            exec(@sql)
            fetch next from cursRef into @sql
        end
    close cursRef   
    deallocate cursRef

    --drop and recreate primairy keys
    declare @pktable table (constraintname nvarchar(255),tablename nvarchar(255),colname nvarchar(255))
    insert into @pktable(constraintname,tablename,colname)
    SELECT CONSTRAINT_NAME,TABLE_NAME,COLUMN_NAME
    FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
    WHERE OBJECTPROPERTY(OBJECT_ID(CONSTRAINT_SCHEMA + '.' + QUOTENAME(CONSTRAINT_NAME)), 'IsPrimaryKey') = 1

    declare @pkname nvarchar(255),@tablename nvarchar(255),@cols nvarchar(255)

    declare Mycurs cursor for
        --maybe more than one col for primairy key
        SELECT 
        p.constraintname,p.tablename,
        STUFF((SELECT '. ' + colname from @pktable where constraintname=p.constraintname
                FOR XML PATH('')), 1, 1, '') [cols]
        FROM @pktable p
        GROUP BY constraintname,tablename

    open mycurs
        fetch next from mycurs into @pkname,@tablename,@cols
        while @@fetch_status = 0 begin
            --drop key
            set @sql='alter table ' + @tablename + ' drop CONSTRAINT [' + @pkname + ']'
            print @sql
            exec(@sql)
            --create key
            set @sql='alter table ' + @tablename + ' add CONSTRAINT [pk_' + @tablename + '] primary key NONCLUSTERED (' + ltrim(@cols) + ')'
            print @sql
            exec(@sql)

            fetch next from mycurs into @pkname,@tablename,@cols
        end
    close MyCurs    
    deallocate MyCurs

GO

【讨论】:

  • 推荐用于此程序,比方便的东西更好
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多