簡體   English   中英

刪除唯一約束的過程

[英]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_executesqlhttp//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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM