DDL не выполняется должным образом внутри оператора IF NOT EXISTS в SQL Server 2005.

StackOverflow https://stackoverflow.com/questions/675570

  •  21-08-2019
  •  | 
  •  

Вопрос

У меня есть довольно сложная база данных, которую необходимо развернуть на различных серверах, на которых потенциально могут быть или не быть уже реализованные части БД.Чтобы обойти эту непредвиденную ситуацию, я настроил следующий тест:

USE [testDB]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[wcSites]') AND type in (N'U'))
begin
    CREATE TABLE [dbo].[wcSites](
        [id] [int] IDENTITY(1,1) NOT NULL,
        [name] [varchar](100) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
        [siteCSS] [varchar](100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
        [masterTemplate] [int] NULL,
        [errorPage] [int] NULL,
        [homePage] [int] NULL,
        [addressProduction] [varchar](100) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
        [addressTest] [varchar](100) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
        [routeHandler] [varchar](100) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
        [publish] [bit] NOT NULL CONSTRAINT [DF_wcSites_publish]  DEFAULT ((0)),
        [publicAccess] [bit] NOT NULL CONSTRAINT [DF_wcSites_publicAccess]  DEFAULT ((1)),
        [siteAccessPermission] [varchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NULL,
        [contentOwner] [int] NULL,
        [navStyle] [int] NULL,
        [incScripts] [int] NULL,
        [boxW] [int] NULL,
        [boxH] [int] NULL,
        [columns] [int] NULL,
        [rows] [int] NULL,
     CONSTRAINT [PK_wcSites] PRIMARY KEY CLUSTERED 
    (
        [id] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY],
     CONSTRAINT [IX_wcSites_Unique_Address] UNIQUE NONCLUSTERED 
    (
        [addressProduction] ASC,
        [addressTest] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]

    GO
    SET ANSI_PADDING OFF
    GO
    EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Ensure unique addresses in the addressProduction, addressTest fields' , @level0type=N'SCHEMA',@level0name=N'dbo', @level1type=N'TABLE',@level1name=N'wcSites', @level2type=N'CONSTRAINT',@level2name=N'IX_wcSites_Unique_Address'
end

И конечный результат всегда:

Msg 102, Level 15, State 1, Line 32
Incorrect syntax near 'PRIMARY'.
Msg 102, Level 15, State 1, Line 2
Incorrect syntax near 'end'.

Если я проверю оператор IF, он работает правильно:

IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[wcSites]') AND type in (N'U'))
begin
    PRINT 'Table does not exist'
end

И то же самое, когда я тестирую сценарий CREATE TABLE.Но когда я помещаю сценарий CREATE TABLE в блок Begin..end, он каждый раз терпит неудачу.И у меня проблема по всем направлениям: почти каждая таблица, использующая этот метод, терпит неудачу.

Это было полезно?

Решение

Попробуйте удалить операторы go в блоке Begin..end, посмотрите, поможет ли это.

Другие советы

Я немного не понимаю синтаксиса SQL Server, но разве оператор GO не пытается выполнить блок?Что произойдет, если заменить go точкой с запятой?

Кроме того, то, что параметр Set Ansi_padding off находится в блоке If, а параметр Set Ansi_padding on находится снаружи, кажется мне странным, вы уверены, что это правильно?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top