2012-09-07 44 views
0

我的MS SQL 2008 R2安裝程序上有一個存儲過程。該過程動態地創建一個表併爲其添加索引。下面顯示的是腳本的簡化版本,向您展示我正在做的事情。當我嘗試將索引信息添加到「@ SQL1」時,字符串長度變得太大,這就是爲什麼它被分成兩個字符串(@ SQL1和@ SQL2)的原因。我遇到的問題是,當表不存在時一切正常,但當表存在時,腳本的索引部分仍然運行。由於索引已經存在,因此失敗。解決這個問題的最佳方法是什麼?我不能將所有的腳本文本放入單個字符串中?如何停止運行我的所有腳本的動態SQL

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) 

回答

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') 
+0

感謝你。這正是我所追求的。它工作的一種享受。 – Retrocoder

2

你能不能檢查,如果存在索引,一樣的,你使用的表格做sys.indexes (Transact-SQL)

喜歡的東西

SELECT * 
FROM sys.indexes 
WHERE name='YourIndexName' AND object_id = OBJECT_ID('YourTableName') 
+0

我可以做到這一點,但我希望有一個不同的認同h因爲會有很多索引,所以可能會變得雜亂,以保持 – Retrocoder

相關問題