[英]Procedure for dropping unique constraint
我正在嘗試編寫一個過程來更快地從任何表中刪除Unique約束。
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
: http : //msdn.microsoft.com/en-us/library/ms175170( sp_executesql
) .aspx
要執行字符串,我們建議您使用sp_executesql存儲過程而不是EXECUTE語句。 因為這個存儲過程支持參數替換,所以sp_executesql比EXECUTE更通用; 並且因為sp_executesql生成更有可能被SQL Server重用的執行計划,所以sp_executesql比EXECUTE更有效。
將exec字符串包裝在括號中:
EXEC (@sql)
執行動態字符串時,需要括號。 執行sprocs時,它們不是。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.