0

MS SQL2008R2のセットアップにストアドプロシージャがあります。このプロシージャは動的にテーブルを作成し、それにインデックスを追加します。以下に示すのは、私が行っていることを示すためのスクリプトの縮小版です。「@SQL1」にインデックス情報を追加しようとすると、文字列の長さが長くなりすぎたため、2つの文字列(@SQL1と@SQL2)に分割されました。私が抱えている問題は、テーブルが存在しない場合はすべて問題ありませんが、テーブルが存在する場合でもスクリプトのインデックス部分が実行されることです。インデックスがすでに存在するため、これは失敗します。すべてのスクリプトテキストを1つの文字列にまとめることができないことを思い出して、これを修正するための最良の方法は何でしょうか。

ALTER PROCEDURE  [evt].[CreateReportingDestinationTable] 
(
    @Name nvarchar(50)
)
AS
    SET NOCOUNT ON;

    DECLARE @SQL1 nvarchar(max)
    DECLARE @SQL2 nvarchar(max)


    SET @SQL1 = "IF NOT EXISTS (SELECT * FROM sys.Tables WHERE name = '" + @Name + "' AND type in (N'U'))
        CREATE TABLE [logs].[" + @Name + "](
            [MessageId] [uniqueidentifier] NOT NULL,
            [TokenNumber] [nvarchar](50) NULL,
         CONSTRAINT [PK_" + @Name + "] PRIMARY KEY CLUSTERED 
        (
            [MessageId] ASC
        )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
        ) ON [PRIMARY]"


    SET @SQL2 = "CREATE NONCLUSTERED INDEX [IX_" + @Name + "_TokenNumber_EventTime] ON [logs].[" + @Name + "]
        (
            [TokenNumber] ASC
        ) WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
        "

    EXEC(@SQL1 + @SQL2)
4

2 に答える 2

2

sys.indexes(Transact-SQL)を使用したテーブルの場合と同じように、インデックスが存在するかどうかを確認できません

何かのようなもの

SELECT *  
FROM sys.indexes  
WHERE name='YourIndexName' AND object_id = OBJECT_ID('YourTableName')
于 2012-09-07T09:17:28.977 に答える
1

テーブルの作成と同じIFブランチにインデックスの作成を含めます。

ALTER PROCEDURE  [evt].[CreateReportingDestinationTable] 
(
    @Name nvarchar(50)
)
AS
    SET NOCOUNT ON;

    DECLARE @SQL1 nvarchar(max)
    DECLARE @SQL2 nvarchar(max)


    SET @SQL1 = "IF NOT EXISTS (SELECT * FROM sys.Tables WHERE name = '" + @Name + "' AND type in (N'U'))
    BEGIN
        CREATE TABLE [logs].[" + @Name + "](
            [MessageId] [uniqueidentifier] NOT NULL,
            [TokenNumber] [nvarchar](50) NULL,
         CONSTRAINT [PK_" + @Name + "] PRIMARY KEY CLUSTERED 
        (
            [MessageId] ASC
        )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
        ) ON [PRIMARY]"


    SET @SQL2 = "CREATE NONCLUSTERED INDEX [IX_" + @Name + "_TokenNumber_EventTime] ON [logs].[" + @Name + "]
        (
            [TokenNumber] ASC
        ) WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
        "

    SET SQL3 = ...
    ...

    EXEC(@SQL1 + @SQL2 + SQL3 + ... + ' END')
于 2012-09-07T09:57:35.463 に答える