【问题标题】:How to stop Dynamic SQL running all of my script如何停止动态 SQL 运行我的所有脚本
【发布时间】:2012-09-07 09:11:38
【问题描述】:

我的 MS SQL 2008 R2 设置中有一个存储过程。该过程动态地创建一个表并向其添加索引。下面显示的是脚本的精简版,向您展示我在做什么。当我尝试将索引信息添加到“@SQL1”时,字符串长度变得太大,这就是为什么它被分成两个字符串(@SQL1 和@SQL2)。我遇到的问题是,当表不存在时一切都很好,但是当表确实存在时,脚本的索引部分仍在运行。这会失败,因为索引已经存在。记住我不能将所有脚本文本放入单个字符串中,解决此问题的最佳方法是什么?

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)

【问题讨论】:

    标签: sql-server-2008 stored-procedures dynamic-sql


    【解决方案1】:

    你可以不检查索引是否存在,就像你使用sys.indexes (Transact-SQL)检查表一样

    类似

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

    【讨论】:

    • 我可以这样做,但我希望采用不同的方法,因为会有很多索引,因此维护起来可能会很混乱
    【解决方案2】:

    将索引的创建包含在与表的创建相同的 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')
    

    【讨论】:

    • 谢谢。这正是我所追求的。这是一种享受。
    猜你喜欢
    • 1970-01-01
    • 2012-10-19
    • 2013-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-27
    • 1970-01-01
    • 2012-07-29
    相关资源
    最近更新 更多