【问题标题】:SQL Server 2008 R2 Referencing Clustered Index of Tables with SQL Query [duplicate]SQL Server 2008 R2 使用 SQL 查询引用表的聚集索引 [重复]
【发布时间】:2014-05-30 18:03:15
【问题描述】:

我想动态更改我的表上的聚集索引的名称,假设它被称为 (MY_TABLE),以便创建的聚集索引采用以下形式:PK_MY_TABLE。问题是,从索引开始的形式是:“PK_MY_TABLE_E86234JKFDS”等。有没有办法在 SQL 语句中引用这样的索引来引用表的聚集索引,尽管“_E86234JKFDS”部分是唯一的?

我希望创建一个始终有效的查询,因为索引名称始终是唯一的,这似乎很困难。也许有一种方法可以引用表的聚集索引,因为只有一个?

谢谢

【问题讨论】:

  • 别那么懒惰 -- msdn.microsoft.com/en-us/library/ms174979.aspx,阅读带有名称的约束的语法 -- 其中约束是主键。
  • 不,我没有忽略你的两部分问题。我想也许你会在被提醒你很懒惰之后自己谷歌这个 - 显然不是。删除现有的聚集索引,然后创建一个新的聚集索引,并可能创建原始索引的非聚集版本。您可以使用 sp_rename 重命名很多东西,但由于新索引可能会索引与原始索引不同的字段,因此 sp_rename 在这种情况下不太可能有用。
  • 我的朋友。在这种情况下,索引名称由数据库生成并且是唯一的。当他们拥有所有这些独特的角色之后,你建议我如何引用它们?
  • 我不确定,但我猜你得到了 -2,因为你问了一些可以通过查找手册或搜索现有解决方案来解决的问题。
  • 获取表的 CI 名称很简单:SELECT name FROM sys.indexes WHERE type = 1 AND object_id = OBJECT_ID('schema.MyTable')

标签: sql sql-server sql-server-2008-r2


【解决方案1】:

这应该可以帮助您入门,尽管尚不清楚您真正想用它们做什么。

SELECT
    'PK_' + tables.name NewName,
    indexes.name CurrentName
FROM sys.indexes join sys.tables ON indexes.object_id = tables.object_id
WHERE indexes.type_desc = 'CLUSTERED'

此外,请记住,如果您在不同的架构中命名相同的表,则可能会发生冲突。例如MySchema.SomeTableAnotherSchema.SomeTable 都会尝试使用聚集索引名称PK_SomeTable,这是不允许的。

【讨论】:

    【解决方案2】:

    首先要了解一件事,即如果表上不存在聚簇索引,则表上的主键约束会自动创建聚簇索引。因此,第一个问题的解决方案要求您首先创建表而不创建主键。然后表创建时没有主键,只需使用以下语法在表上动态创建聚集索引。

    在 [TableName] (ColumnName) 上创建聚集索引 [Index_Name]

    对于动态重命名表上的聚集索引,您可以使用下面的 T-SQL 脚本

    EXEC sp_rename N'SchemaName.TableName.IndexName', N'New_IndexName', N'INDEX';

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-12
      • 1970-01-01
      • 1970-01-01
      • 2014-04-27
      相关资源
      最近更新 更多