在Azure sql服务器上运行脚本但在本地sql服务器上正常运行时出现错误

索拉·帕拉特卡(Saurabh Palatkar)

当我在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 '+@name+' SET  [IsActive] = 1 - [IsDeleted]')
                    END      
                ELSE -- If 'IsActive' column is not present
                    BEGIN
                        -- Add column named 'IsActive'
                        EXEC('ALTER TABLE '+@name+' ADD IsActive bit')
                        -- Copy the reverse value from 'IsDeleted' column to 'IsActive'
                        EXEC ('UPDATE '+@name+' SET  [IsActive] = 1 - [IsDeleted]')
                        -- Add default value constraint for newly added column 'IsActive'
                        EXEC('ALTER TABLE '+@name+' ADD CONSTRAINT DF_'+@name+' 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 '+@name+' 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,所以我创建了具有非聚集索引的复合主键。我希望这张桌子只能像这样。错误是因为该表没有聚簇索引吗?

SveinFidjestøl

是的,错误是因为表没有聚集索引。

来自Azure SQL数据库常规准则和局限性

Microsoft Azure SQL数据库不支持没有聚集索引的表。表必须具有聚集索引。如果创建的表没有聚类约束,则必须先创建聚簇索引,然后才能在该表上执行插入操作。

通过扩展,这也意味着更新操作。因此,脚本中以下动态生成的SQL在执行时将给出错误消息:

EXEC ('UPDATE '+@name+' SET  [IsActive] = 1 - [IsDeleted]')

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

我的网站在本地服务器上正常运行,但是当在azure上发布并运行时,它给了我这个错误

安装 Microsoft.Azure.SignalR.AspNet 会导致方法在部署到服务器时未实现运行时错误,但在 Visual Studio 2017 上运行良好

在IIS服务器上本地运行的ASP.Net Web应用未在Azure上运行

在Azure Databricks上运行Bokeh服务器吗?

在场所服务器上运行Azure WebJob

无法从Linux上的Laravel连接Azure SQL服务器

在 Azure DevOps 服务器中运行时 Selenium 日志在哪里

是否可以使用TSQL查询Azure SQL服务器在哪个程序包/层上运行?

本地服务器上需要Azure SDK?

在服务器上发布后运行但在本地计算机上正常运行时,在mvc 5中加载视图时出现异常

Azure VM 上的 Web 服务器

远程服务器上的UnintentionalCodeFirstException(Azure)

Azure上的R服务器

无法在azure服务器上工作,但在本地环境下可以正常工作吗?

从服务器下载了Magento网站,但在本地服务器上运行时遇到困难。

在Azure Pipeline中运行时,VSTest对DNS服务器(8.8.8.8)进行单元测试的ping操作失败

哪个是基于NodeJS的Azure Web App(Linux)上运行的默认Web服务器?

应该/可以在Azure上运行Node-OPCUA服务器吗?

使用Azure管道在特定的自托管服务器上运行

在azure服务器上发出运行rake任务的问题(通过cloud66)

Cookie在服务器上不会滑动,但在本地运行时会滑动

升级Azure SQL服务器

使用Azure移动服务中的服务器脚本中的查询更新多个记录时出现SQL错误42S22

从我们的服务器运行但在本地运行时收到NLog错误

在Azure SQL服务器上添加故障转移组时的JDBC连接字符串

通过 ARM 模板在 Azure SQL 服务器上启用漏洞评估

使用数据库连接将代码部署到Azure Web时,Flask应用程序无法呈现,但是在本地服务器上运行良好

如何将本地数据库服务器连接到SQL Azure数据库服务器

在Azure服务器中自动运行Python的代码片段