1

我正在尝试编写一个过程来更快地从任何表中删除唯一约束。

IF EXISTS
        (SELECT * 
        FROM dbo.sysobjects 
        WHERE id = object_id(N'[dba].[spu_drop_uq_index]'))
    DROP PROCEDURE [dba].[spu_drop_uq_index]
GO

CREATE PROCEDURE [dba].[spu_drop_uq_index] (@table varchar(1000), @index varchar(1000))
AS
BEGIN
    DECLARE @sql varchar(1000)
    SET @sql = 'ALTER TABLE ['+@table+'] DROP CONSTRAINT ['+@index+']'
    IF EXISTS (SELECT name FROM sysindexes WHERE name = @index)
        EXEC @sql
END    
GO

EXEC [dba].[spu_drop_uq_index] @table = 'aaa', @index = 'UQ_xxx'
GO

但我收到一个错误:

The name 'ALTER TABLE [aaa] DROP CONSTRAINT [UQ_xxx]' is not a valid identifier.

但是,如果我不是动态执行它,它会成功:

ALTER TABLE [aaa] DROP CONSTRAINT [UQ_xxx]

我究竟做错了什么?:) 谢谢!

4

2 回答 2

3

采用

 exec sp_executesql @sql

代替EXEC, 或将 the@sql放在括号中

 Exec (@sql)

sp_executesql首选: http: //msdn.microsoft.com/en-us/library/ms175170 (v=sql.105).aspx

要执行字符串,我们建议您使用 sp_executesql 存储过程而不是 EXECUTE 语句。因为这个存储过程支持参数替换,所以 sp_executesql 比 EXECUTE 更通用;并且因为 sp_executesql 生成的执行计划更有可能被 SQL Server 重用,所以 sp_executesql 比 EXECUTE 更有效。

于 2012-07-27T10:39:37.273 回答
1

将 exec 字符串括在括号中:

EXEC  (@sql)

执行动态字符串时,需要括号。执行存储过程时,它们不是。

于 2012-07-27T10:39:58.143 回答