2015-02-10 3 views
0

Когда я запускаю следующий запрос на Azure SQL, он дает мне следующую ошибку:Получение ошибки при запуске сценария на сервере SQL Azure, но корректно работает на локальном сервере SQL

Ошибка: Таблицы без кластерного индекса не являются поддерживается в этой версии SQL Server. Создайте кластерный индекс и повторите попытку.

В то время как скрипт работает прекрасно на локальном сервере SQL

Сценарий:

--Script for removing 'IsDeleted' column from all the table and copy the reverse values to the 'IsActive' column 
DECLARE @name VARCHAR(50) 
DECLARE @TQ VARCHAR(500) 
DECLARE @ConstrainName VARCHAR(500) 

--Declare cursor and loop it on INFORMATION_SCHEMA.TABLES and get table name in variable @name one by one 
DECLARE db_cursor CURSOR 
FOR 
    SELECT TABLE_NAME 
    FROM INFORMATION_SCHEMA.TABLES 
    WHERE TABLE_TYPE = 'BASE TABLE' 

OPEN db_cursor 
FETCH NEXT FROM db_cursor INTO @name 

WHILE @@FETCH_STATUS = 0 
    BEGIN --If 'IsDeleTed' column is present 
     IF COL_LENGTH(@name, 'IsDeleted') IS NOT NULL 
      BEGIN -- If 'IsActive' column is present 
       IF COL_LENGTH(@name, 'IsActive') IS NOT NULL 
        BEGIN -- Copy the reverse value from 'IsDeleted' column to 'IsActive' 
         EXEC ('UPDATE '[email protected]+' SET [IsActive] = 1 - [IsDeleted]') 
        END  
       ELSE -- If 'IsActive' column is not present 
        BEGIN 
         -- Add column named 'IsActive' 
         EXEC('ALTER TABLE '[email protected]+' ADD IsActive bit') 
         -- Copy the reverse value from 'IsDeleted' column to 'IsActive' 
         EXEC ('UPDATE '[email protected]+' SET [IsActive] = 1 - [IsDeleted]') 
         -- Add default value constraint for newly added column 'IsActive' 
         EXEC('ALTER TABLE '[email protected]+' ADD CONSTRAINT DF_'[email protected]+' DEFAULT(1) for [IsActive]') 

        END 
       IF EXISTS (SELECT * 
          FROM sysobjects o 
            INNER JOIN syscolumns c ON o.id = c.cdefault 
            INNER JOIN sysobjects t ON c.id = t.id 
          WHERE o.xtype = 'D' 
            AND c.name = 'IsDeleted' 
            AND t.name = @name) 
        BEGIN -- If default constraint exist on column 'IsDeleted', get the constraint name 
         SET @ConstrainName = (SELECT o.name 
              FROM sysobjects o 
                INNER JOIN syscolumns c ON o.id = c.cdefault 
                INNER JOIN sysobjects t ON c.id = t.id 
              WHERE o.xtype = 'D' 
                AND c.name = 'IsDeleted' 
                AND t.name = @name 
              ) 
         -- Drop the default constraint from the column 'IsDeleted' 
         EXEC('ALTER TABLE ' + @name + ' drop constraint ' + @ConstrainName) 
        END 
       -- Finally drop the column 'IsDeleted' 
       EXEC('ALTER TABLE '[email protected]+' DROP COLUMN [IsDeleted]') 
      END 

     FETCH NEXT FROM db_cursor INTO @name 
    END 

CLOSE db_cursor 
DEALLOCATE db_cursor 

выше сценарий просто пробегаем по всем таблицам в БД, то найти «IsDeleted» столбца и заменить его столбцом «IsActive». Какие изменения мне нужно сделать в моем предыдущем запросе, чтобы запустить его на Azure SQL?

У меня есть одна таблица в db, у которой нет кластерного индекса. Его схема:

--CREATE TEMP TABLE 
CREATE TABLE [dbo].[Temp](
    [LayoutId] [int] NOT NULL, 
    [UnitTypeId] [int] NOT NULL, 
    [ProjectId] [int] NOT NULL, 
    [LayoutName] [nvarchar](150) NOT NULL, 
    [LayoutDescription] [nvarchar](max) NOT NULL, 
    [IsActive] [bit] NOT NULL, 
    [IsDeleted] [bit] NOT NULL, 
    [CreatedTs] [datetime] NOT NULL, 
    [ModifiedTs] [datetime] NULL, 

    CONSTRAINT PK_UserGroup PRIMARY KEY NONCLUSTERED ([LayoutId], [ProjectId]) 
) 

GO 

ALTER TABLE [dbo].[Temp] ADD CONSTRAINT [DF_Temp_IsActive] DEFAULT ((1)) FOR [IsActive] 
GO 

ALTER TABLE [dbo].[Temp] ADD CONSTRAINT [DF_Temp_IsDeleted] DEFAULT ((0)) FOR [IsDeleted] 
GO 

ALTER TABLE [dbo].[Temp] ADD CONSTRAINT [DF_Temp_CreatedTs] DEFAULT (getdate()) FOR [CreatedTs] 
GO 

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

ответ

1

Да, ошибка состоит в том, что таблица не имеет кластерного индекса.

От Azure SQL Database General Guidelines and Limitations

Microsoft Azure SQL Database does not support tables without clustered indexes. A table must have a clustered index. If a table is created without a clustered constraint, a clustered index must be created before an insert operation is allowed on the table.

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

EXEC ('UPDATE '[email protected]+' SET [IsActive] = 1 - [IsDeleted]') 
Смежные вопросы