Модераторы: Akina
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как присвоить IDENTITY уже существующему столбцу ? 
:(
    Опции темы
AndreyK
Дата 31.12.2008, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 15.3.2007

Репутация: нет
Всего: нет



У меня есть база данных.

Я её ,при помощи стандартной утилиты, конвертирую в MS SQL Server.

Но вот незадача - индексы и свойства autoincrement не конвертируются.

Ну индексы то можно потом воссоздать... а вот как снова назначить полю свойство  IDENTITY ?

Неужели никак нельзя это сделать?

ALTER TABLE не умеет (:


PM MAIL   Вверх
Zioma
Дата 28.1.2009, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 150
Регистрация: 22.8.2007

Репутация: 5
Всего: 5



Можно только через дополнительную таблицу. Если сам не справишься - пиши.
PM MAIL   Вверх
AndreyK
Дата 16.6.2009, 15:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 102
Регистрация: 15.3.2007

Репутация: нет
Всего: нет



Случайно вспомнил про этот вопрос и решил тут поместить пример кода, как я тогда решил эту проблему

Пришлось создавать временный столбец.

Особо комментировать не буду (уже и сам не помню) но вот код:
Код

sub ConvertID(DefTableName as String, FieldName as String)
            Dim resok As Boolean
            Dim resok2 As Boolean
            Dim dqy As ADODB.Recordset
            Dim idqy As Integer
            resok = True
            tempfiedfound = False
            'проверка может уже присвоен IDENTITY и ничего делать не надо
            Set dqy = GetRecorset("SELECT TOP 0 $IDENTITY FROM " + DefTableName)
            If dqy Is Nothing Then
              Execute "ALTER TABLE " + DefTableName + " ADD " + FieldName + "_temp " + Cfield + " "
              If Execute("UPDATE " + DefTableName + " SET " + FieldName + "_temp=" + FieldName) Then
                Execute ("DROP INDEX " + FieldName + " ON " + DefTableName)
                Execute ("ALTER TABLE " + DefTableName + " DROP COLUMN " + FieldName)
                'чтоб не было конфликтов с нумерацией временный IDENTITY сдвигается в отрицательные числа
                If Execute("ALTER TABLE " + DefTableName + " ADD " + FieldName + " " + Cfield + " IDENTITY (-9999999,1)") Then
                  Execute "CREATE UNIQUE INDEX " + FieldName + " ON " + DefTableName + "(" + FieldName + ") "
                  resok = tmpFieldToID(FieldName)
                Else
                  resok = False
                End If
              Else
                resok = False
              End If
              tempfiedfound = True
            Else
              dqy.Close
              Set dqy = GetRecorset("SELECT TOP 0 " + FieldName + "_temp FROM " + DefTableName)
              If Not dqy Is Nothing Then
                dqy.Close
                Execute "CREATE UNIQUE INDEX " + FieldName + " ON " + DefTableName + "(" + FieldName + ") "
                resok = tmpFieldToID(FieldName)
                tempfiedfound = True
              Else
                tempfiedfound = False
              End If
            End If
            If Not resok Then
              MsgBox lasterror + CRLF + ".Не удалось исправить поле " + DefTableName + "." + FieldName + " база не соответствует требованиям"
            Else
              If tempfiedfound Then
                Execute "ALTER TABLE " + DefTableName + " DROP COLUMN " + FieldName + "_temp "
              End If
            End If
End Sub

Function tmpFieldToID(FieldName As String) As Boolean
  Dim dqy As ADODB.Recordset
  Dim sinsert As String
  Dim sinsert2 As String
  Dim resok As Boolean
  resok = True
  Execute "DBCC CHECKIDENT (" + DefTableName + ", RESEED, 1);"
  Set dqy = GetRecorset("SELECT TOP 0 * FROM " + DefTableName, True)
  sinsert = vbNullString
  For idim = 0 To dqy.Fields.Count - 1
    If idim > 0 Then
        sinsert = sinsert + ","
        sinsert2 = sinsert2 + ","
    End If
    sinsert = sinsert + dqy.Fields(idim).Name
    If UCase(dqy.Fields(idim).Name) = UCase(FieldName) Then
      sinsert2 = sinsert2 + dqy.Fields(FieldName + "_temp").Name
    Else
      sinsert2 = sinsert2 + dqy.Fields(idim).Name
    End If
  Next
  dqy.Close
  If Not Execute("SET IDENTITY_INSERT " + DefTableName + " ON;" + "INSERT " + DefTableName + " (" + sinsert + ") SELECT " + sinsert2 + " FROM " + DefTableName + ";" + "SET IDENTITY_INSERT " + DefTableName + " OFF", , True) Then
    resok = False
  Else
m1:
    If Not Execute("DELETE FROM " + DefTableName + " WHERE " + FieldName + "<-100", , True) Then
      If MsgBox("Не удалось удалить мусор в " + DefTableName + " повторить попытку?", vbYesNo) = vbYes Then
        GoTo m1
      End If
    End If
  End If
  tmpFieldToID = resok
End Function



Там используются пара моих функций (GetRecorset и Execute) - что они делают объяснять не надо.

Вот редиски эти разработчики MSSQL - такой простой вопрос не смогли предусмотреть, сколько их за это уже ругают ...


Это сообщение отредактировал(а) AndreyK - 16.6.2009, 15:35
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "MS SQL"
Akina

Akina

Запрещается!

Публиковать ссылки и обсуждать взлом чего бы то ни было.

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы составления неспецифических запросов рассматриваются здесь
  • Используйте теги [code=sql][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, Akina.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MS SQL Server | Следующая тема »


 




[ Время генерации скрипта: 0.0438 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.