Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 删除唯一约束的过程_Sql_Sql Server 2008_Unique Constraint_Sql Drop - Fatal编程技术网

Sql 删除唯一约束的过程

Sql 删除唯一约束的过程,sql,sql-server-2008,unique-constraint,sql-drop,Sql,Sql Server 2008,Unique Constraint,Sql Drop,我正在尝试编写一个过程,以便更快地从任何表中删除唯一约束 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 var

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

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]
我做错了什么?:)谢谢

使用

 exec sp_executesql @sql
而不是
EXEC
,或者将
@sql
放在括号中

 Exec (@sql)
sp_executesql
是首选:

要执行字符串,建议使用sp_executesql存储过程而不是execute语句。由于此存储过程支持参数替换,因此sp_executesql比executesql更通用;而且,由于sp_executesql生成的执行计划更有可能被SQL Server重用,因此sp_executesql比executesql更高效

使用

而不是
EXEC
,或者将
@sql
放在括号中

 Exec (@sql)
sp_executesql
是首选:

要执行字符串,建议使用sp_executesql存储过程而不是execute语句。由于此存储过程支持参数替换,因此sp_executesql比executesql更通用;而且,由于sp_executesql生成的执行计划更有可能被SQL Server重用,因此sp_executesql比executesql更高效


将exec字符串括在括号中:

EXEC  (@sql)

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

EXEC  (@sql)

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

@AndriusNaruševičius也可以使用quotename,而不是添加[]manually@AndriusNaruševičius也可以使用quotename,而不是手动添加[]