代码之家  ›  专栏  ›  技术社区  ›  g t Omri Btian

如何使用变量在SQL Server中指定文件组

  •  4
  • g t Omri Btian  · 技术社区  · 15 年前

    我想更改一个表,以便在升级SQL Server数据库期间添加约束。

    此表通常在名为“我的索引”的文件组中编制索引,但也可能在没有此文件组的数据库中编制。在这种情况下,我希望对“primary”文件组进行索引。

    我尝试了以下代码来实现这一点:

    DECLARE @fgName AS VARCHAR(10)
    
    SET @fgName = CASE WHEN EXISTS(SELECT groupname
                                    FROM sysfilegroups
                                    WHERE groupname = 'MY_INDEX')
                        THEN QUOTENAME('MY_INDEX')
                        ELSE QUOTENAME('PRIMARY')
                  END
    
    ALTER TABLE [dbo].[mytable]
    ADD CONSTRAINT [PK_mytable] PRIMARY KEY
    (
        [myGuid] ASC
    )
    ON @fgName -- fails: 'incorrect syntax'
    

    但是,最后一行失败,因为似乎不能通过变量指定文件组。

    这有可能吗?

    3 回复  |  直到 15 年前
        1
  •  2
  •   Reagan Williams    15 年前

    我发现动态SQL在DDL语句中传递变量时有效。

    尝试如下操作:

    DECLARE @fgName AS VARCHAR(10) 
    
    SET @fgName = CASE WHEN EXISTS(SELECT groupname 
                                    FROM sysfilegroups 
                                    WHERE groupname = 'MY_INDEX') 
                        THEN QUOTENAME('MY_INDEX') 
                        ELSE QUOTENAME('PRIMARY') 
                  END 
    
    DECLARE @sql as varchar(1024)
    
    SET @sql = 'ALTER TABLE [dbo].[mytable] ADD CONSTRAINT [PK_mytable] PRIMARY KEY ( 
        [myGuid] ASC ) ON ' + @fgName
    
    EXEC(@sql)
    

    我希望这有帮助…

        2
  •  1
  •   marc_s MisterSmith    15 年前

    我相信如果SQL Server返回 incorrect syntax 不幸的是,可能没有办法做到这一点。

    您需要将文件组名称指定为字符串文本。

    你可能只需要重写你的脚本就可以了:

    IF EXISTS(SELECT groupname FROM sysfilegroups WHERE groupname = 'MY_INDEX')
         ALTER TABLE [dbo].[mytable]
           ADD CONSTRAINT [PK_mytable] 
           PRIMARY KEY([myGuid] ASC) ON 'MY_INDEX'
    ELSE
         ALTER TABLE [dbo].[mytable]
           ADD CONSTRAINT [PK_mytable] 
           PRIMARY KEY([myGuid] ASC) ON 'PRIMARY'
    
        3
  •  0
  •   Aaron D    12 年前

    替换 ELSE QUOTENAME('PRIMARY') 具有 ELSE QUOTENAME('[PRIMARY]')