0

私は、現在のデータベースにテーブルが存在しない場合にのみテーブルを作成することについてSOを検討していました(テーブルをまだ持っていない場合もあれば、持っていない場合もある別のデータベースでテーブルを作成できるようにするため)、これら2つの役立つトピックを見つけました

だから私はこのクエリをしました

IF (NOT EXISTS (SELECT * 
             FROM INFORMATION_SCHEMA.TABLES 
             WHERE TABLE_NAME = 'EMAILCONTAS'))
BEGIN
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

SET ANSI_PADDING ON
GO

CREATE TABLE [dbo].[EMAILCONTAS](
    [NRSEQEMAILCONTAS] [numeric](8, 0) NOT NULL,
    [CDEMAILCONTAS] [varchar](40) NULL,
    [MSGEMAILCONTAS] [varchar](4000) NOT NULL,
    [CCOEMAIL] [varchar](100) NULL,
    [NRSEQOPERADORA] [numeric](8, 0) NOT NULL,
 CONSTRAINT [PK_EMAILCONTAS] PRIMARY KEY CLUSTERED 
(
    [NRSEQEMAILCONTAS] 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

ALTER TABLE [dbo].[EMAILCONTAS]  WITH CHECK ADD FOREIGN KEY([NRSEQOPERADORA])
REFERENCES [dbo].[OPERADORA] ([NRSEQOPERADORA])
GO

ALTER TABLE [dbo].[EMAILCONTAS]  WITH CHECK ADD  CONSTRAINT [FK_EMAILCONTAS_OPERADORA] FOREIGN KEY([NRSEQOPERADORA])
REFERENCES [dbo].[OPERADORA] ([NRSEQOPERADORA])
GO

ALTER TABLE [dbo].[EMAILCONTAS] CHECK CONSTRAINT [FK_EMAILCONTAS_OPERADORA]
GO
END

しかし、それを実行すると、エラーリストにこれが表示されます。

Msg 102, Level 15, State 1, Line 5
Incorrect syntax near 'ON'.

しかし、とにかくテーブルを作成します(上記のコードの後に​​「Select * from PERSON;」を付けて、エラーが次のスクリプトのコンパイルをブロックするかどうかを確認します。エラーがブロックしました。このエラーを表示する:

Msg 156, Level 15, State 1, Line 3
Incorrect syntax near the keyword 'Select'.

それを回避する方法はありますか?)。そして、このクエリを実行し、テーブルがすでに存在する場合、次のエラーが発生しました。

Msg 102, Level 15, State 1, Line 5
Incorrect syntax near 'ON'.
Msg 2714, Level 16, State 6, Line 2
There is already an object named 'EMAILCONTAS' in the database.
Msg 2714, Level 16, State 5, Line 2
There is already an object named 'FK_EMAILCONTAS_OPERADORA' in the database.
Msg 1750, Level 16, State 0, Line 2
Could not create constraint. See previous errors.

これらのエラーを取得せずにこれを達成するにはどうすればよいですか?このような複数のコードを問題なく作成できる方法はありますか?私は何が間違っているのですか?

4

2 に答える 2

2

GOスクリプトの終わりに似ています。GOBEGIN-ENDステートメント内からsを削除できます。

どうしてもGOコードに含める必要がある場合は、クエリを次のように分割できます。

IF (criteria)
BEGIN
    ...
END

GO

IF (newcriteria)
BEGIN
    ...
END
于 2012-07-30T13:26:01.787 に答える
1

私が働いている場所では、すべてのスクリプトにそのチェックが必要です。この例では、チェックの前にすべての設定があります。

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].[DimTime]') AND type in (N'U'))
    BEGIN
        Create Table [dbo].[DimTime]
        (
            TimeID int PRIMARY KEY IDENTITY(1,1),
            Month int,
            Year int,
            Day int,
        )
    END
于 2012-07-30T13:25:38.600 に答える