8

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

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

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

谢谢

4

2 回答 2

4

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

于 2012-01-17T15:31:19.240 回答
1

我已经创建了一个存储过程,可以为您完成这项工作。首先我们必须删除所有外键,否则我们不能删除主键约束。改变我们循环到键 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
于 2018-02-03T14:58:04.490 回答