1

任意のテーブルから 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]

私は何を間違っていますか?:) ありがとう!

4

2 に答える 2

3

使用する

 exec sp_executesql @sql

の代わりにEXEC、または@sql括弧で囲みます

 Exec (@sql)

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

文字列を実行するには、EXECUTE ステートメントの代わりに sp_executesql ストアド プロシージャを使用することをお勧めします。このストアド プロシージャはパラメーター置換をサポートしているため、sp_executesql は EXECUTE よりも汎用性があります。また、sp_executesql は SQL Server によって再利用される可能性が高い実行プランを生成するため、sp_executesql は EXECUTE よりも効率的です。

于 2012-07-27T10:39:37.273 に答える
1

exec 文字列を角かっこで囲みます。

EXEC  (@sql)

動的文字列を実行するときは、括弧が必要です。sprocs を実行するとき、そうではありません。

于 2012-07-27T10:39:58.143 に答える