【发布时间】:2015-05-29 07:55:20
【问题描述】:
灵感来自这个 SO Question
我创建了这个程序:
CREATE PROCEDURE [dbo].[dropIndexWithSchema](@schemaName VARCHAR(200), @tableName VARCHAR(200), @indexName VARCHAR(200))
AS
BEGIN
DECLARE @sql nvarchar(512)
IF EXISTS (SELECT i.* FROM @schemaName.sys.indexes i WHERE i.name = @indexName AND i.object_id = OBJECT_ID(@schemaName + '.dbo.' + @tableName))
BEGIN
SELECT @sql = 'DROP INDEX ' + @indexName + ' ON ' + @schemaName + '.dbo.' + @tableName;
EXEC sp_executesql @sql
END
END
GO
当然这不起作用,因为 FROM 子句中的 @schemaName 无法参数化。还有为OBJECT_ID函数构造对象名的问题。
我想编写一个过程,该过程将从模式 A 中删除模式 B 中表的索引(如果存在)。
【问题讨论】:
-
没有
<schemaname>.sys.indexes这样的东西。这是<database>.sys.indexes -
感谢您的反馈。我会注意它的未来。在谈论各种数据库产品中的类似概念时,我感到很困惑。
-
架构是查询的
dbo部分。您可能在同一数据库的不同架构中的dbo.instruments和dbo2.instruments上有多个IX_Test。
标签: sql-server