«PK_dbo.TableName» не является допустимым именем »с таблицей Access ODBC, связанной с SQL Server - PullRequest
7 голосов
/ 29 марта 2010

Я пытаюсь связать БД Access 2003 с таблицами в базе данных SQL Server 2008, используя ODBC. Когда я пытаюсь связаться с таблицами, для которых установлен первичный ключ, я получаю следующее сообщение об ошибке.

"'Pk_dbo.Batch_Claims' не является допустимым именем. Убедитесь, что оно не содержит недопустимых символов или знаков препинания и не имеет длинных символов."

Pk_dbo.Batch_Claims - это значение ключа, которое я вижу при просмотре таблицы через SSMS. Я использовал Access некоторое время, но я немного новичок в SQL Server и соединениях, использующих ODBC. Любая помощь будет оценена.

Спасибо

Ответы [ 2 ]

3 голосов
/ 17 января 2012

Вам необходимо переименовать первичный ключ, открыв базу данных SQL Server (или Azure) в SQL Server Management Studio. См. Раздел «Обход неправильных имен первичных ключей» в этой записи блога: Связывание таблиц Microsoft Access 2010 с базой данных SQL Azure

1 голос
/ 03 февраля 2018

Я создал хранимую процедуру, которая сделает эту работу за вас. сначала мы должны удалить все внешние ключи, в противном случае мы не можем удалить ограничение первичного ключа. После того, как мы зациклились на сбросе ключей и воссоздали их

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
...