Python-MSSQL (pymssql) Установить поле Identity Column - PullRequest
0 голосов
/ 29 мая 2018

Я пытался установить ObjectID как столбец идентификаторов, используя python на SQL.Приведенная ниже инструкция SQL работает в Management Studio (SSMS) и устанавливает столбец ObjectID в качестве идентификатора.Код работает, но при проверке таблицы в SSMS я не вижу ObjectID в качестве столбца Identity.

Следующие способы работают на python, но не меняют столбец идентификации в SSMS.

  1. Добавление conn.commit() после каждого выполнения.

  2. Запуск файла .sql с помощью программы чтения файлов Python.

На изображении столбец Identity остается пустым после выполнения кода в Python.

enter image description here

Код был сгенерирован SSMS, и моя цель - установить поле ObjectID в столбце Identity.Может быть, есть лучший способ.

Вот код:

newTableName = "A_Test_DashAutomation"
try:
    cursor.execute("""
    BEGIN TRANSACTION
    SET QUOTED_IDENTIFIER ON
    SET ARITHABORT ON
    SET NUMERIC_ROUNDABORT OFF
    SET CONCAT_NULL_YIELDS_NULL ON
    SET ANSI_NULLS ON
    SET ANSI_PADDING ON
    SET ANSI_WARNINGS ON
    COMMIT
    BEGIN TRANSACTION """)

    cursor.execute("""
    CREATE TABLE dbo.Tmp_""" + newTableName + """
        (
        SubProjectTempId bigint NULL,
        CIPNumber varchar(16) NOT NULL,
        Label nvarchar(50) NULL,
        Date_Started datetime2(7) NULL,
        Date_Completed datetime2(7) NULL,
        Status nvarchar(25) NULL,
        Shape geography NULL,
        Type varchar(2) NOT NULL,
        ProjectCode varchar(16) NULL,
        ActiveFlag int NULL,
        Category varchar(32) NULL,
        ProjectDescription varchar(64) NULL,
        UserDefined varchar(1024) NULL,
        InactiveReasonDate datetime NULL,
        FYTDBudget money NULL,
        LTDBudget money NULL,
        PeriodExpenses money NULL,
        FYTDExpenses money NULL,
        LTDExpenses money NULL,
        LTDEncumbrances money NULL,
        LTDBalance money NULL,
        FiscalYear int NULL,
        ToPeriod int NULL,
        _LastImported datetime NOT NULL,
        OBJECTID int NOT NULL IDENTITY (1, 1),
        GDB_GEOMATTR_DATA varbinary(MAX) NULL
        )  ON [PRIMARY]
         TEXTIMAGE_ON [PRIMARY]
    """)

    cursor.execute("ALTER TABLE dbo.Tmp_" + newTableName + " SET (LOCK_ESCALATION = TABLE)")

    cursor.execute("SET IDENTITY_INSERT dbo.Tmp_" + newTableName + " ON")

    cursor.execute("""
    IF EXISTS(SELECT * FROM dbo.""" + newTableName + """)
         EXEC('INSERT INTO dbo.Tmp_""" + newTableName + """ (SubProjectTempId, CIPNumber, Label, Date_Started, Date_Completed, Status, Shape, Type, ProjectCode, ActiveFlag, Category, ProjectDescription, UserDefined, InactiveReasonDate, FYTDBudget, LTDBudget, PeriodExpenses, FYTDExpenses, LTDExpenses, LTDEncumbrances, LTDBalance, FiscalYear, ToPeriod, _LastImported, OBJECTID, GDB_GEOMATTR_DATA)
            SELECT SubProjectTempId, CIPNumber, Label, Date_Started, Date_Completed, Status, Shape, Type, ProjectCode, ActiveFlag, Category, ProjectDescription, UserDefined, InactiveReasonDate, FYTDBudget, LTDBudget, PeriodExpenses, FYTDExpenses, LTDExpenses, LTDEncumbrances, LTDBalance, FiscalYear, ToPeriod, _LastImported, OBJECTID, GDB_GEOMATTR_DATA FROM dbo.""" + newTableName + """ WITH (HOLDLOCK TABLOCKX)')
    """)

    cursor.execute("SET IDENTITY_INSERT dbo.Tmp_" + newTableName + " OFF")

    cursor.execute("DROP TABLE dbo." + newTableName)

    cursor.execute("EXECUTE sp_rename N'dbo.Tmp_" + newTableName + "', N'" + newTableName + "', 'OBJECT'")

    cursor.execute("""
    ALTER TABLE dbo.""" + newTableName + """ ADD CONSTRAINT
        R1143_pk PRIMARY KEY CLUSTERED 
        (
        OBJECTID
        ) WITH( PAD_INDEX = OFF, FILLFACTOR = 75, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]

    """)

    cursor.execute("""
    CREATE SPATIAL INDEX SIndx ON dbo.""" + newTableName + """(Shape) USING GEOGRAPHY_AUTO_GRID
         WITH( CELLS_PER_OBJECT  = 16, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
    """)

    cursor.execute("""
    ALTER TABLE dbo.""" + newTableName + """ ADD CONSTRAINT
        g1084_ck CHECK (([Shape].[STSrid]=(4326)))
    """)

    cursor.execute("COMMIT")

    conn.commit()
    print("Object ID is set to Identify column.")

except pymssql.DatabaseError, err:
    print(str(err))

Любая помощь будет оценена.

Спасибо

1 Ответ

0 голосов
/ 30 мая 2018

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

Приветствия

cursor.execute("""
ALTER TABLE dbo.""" + newTableName + """ ADD CONSTRAINT
    g1084_ck CHECK (([Shape].[STSrid]=(4326))) """)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...