5

tblFooという名前のテーブルがあり、tblFooBarという名前を付けたい場合、SQLコマンドまたはこれを実行できる何かを見つけたいです。ただし、主キーも変更したいです。たとえば、現在は次のようになっています。

CONSTRAINT [PK_tblFoo] PRIMARY KEY CLUSTERED 

そして、名前を変更して次のように変更したい:

CONSTRAINT [PK_tblFooBar] PRIMARY KEY CLUSTERED 

次に、この変更を再帰的に調べて、外部キー関係を持つすべてのテーブルにカスケードします。これから:

CHECK ADD  CONSTRAINT [FK_tblContent_tblFoo] FOREIGN KEY([fooID])

これに:

 CHECK ADD  CONSTRAINT [FK_tblContent_tblFooBar] FOREIGN KEY([fooID])

当然のことながら、a) エラーが発生しやすいプロセスであり、b) スケーリングしないため、これをすべて手動で実行しないようにしています。

4

4 に答える 4

7

これは私の思いつきであり、完全ではありません (インデックスに同様のコードを追加する必要があります)。また、同じベース名を持つテーブルからオブジェクトの名前を変更しないようにするコードを追加する必要がありますが、追加の文字があります。たとえば、このコードは tblFoo2 とそれに関連付けられているすべてのオブジェクトもリストします。うまくいけば、それはあなたにとっての始まりです。

DECLARE
    @old_name   VARCHAR(100),
    @new_name   VARCHAR(100)

SET @old_name = 'tblFoo'
SET @new_name = 'tblFooBar'

SELECT
    'EXEC sp_rename ''' + name + ''', ''' + REPLACE(name, @old_name, @new_name) + ''''
FROM dbo.sysobjects
WHERE name LIKE '%' + @old_name + '%'
于 2008-10-10T15:31:06.437 に答える
5

トムによる良い答え
私はここで彼のクエリを拡張してインデックスを含めました

declare
 @old nvarchar(100),
 @new nvarchar(100)

set @old = 'OldName'
set @new = 'NewName'

select 'EXEC sp_rename ''' + name + ''', ''' + 
  REPLACE(name, @old, @new) + ''''
 from sys.objects 
 where name like '%' + @old + '%'
union -- index renames
select 'EXEC sp_rename ''' + (sys.objects.name + '.' + sys.indexes.name)  +  ''', ''' +
  REPLACE(sys.indexes.name, @old, @new) + ''', ''INDEX'''
  from sys.objects 
   left join sys.indexes on sys.objects.object_id = sys.indexes.object_id
  where sys.indexes.name like '%' + @old + '%'
于 2011-12-18T12:15:48.650 に答える
3

テーブルの名前を変更する手間を省く優れたツールは、Red Gate SQL Refactor です。これは、依存関係を自動的に検出し、それらすべてを自動的に処理します。

大ファン :-)

于 2008-10-10T16:51:30.500 に答える
1

私が知る限り、SQL Server はこれを直接行いません。変更を行うには、スクリプトを手動で作成する必要があります。これは、テーブル定義の SQL を生成し (SSMS がこれを行います)、名前の検索と置換を行うことで実現できます。

于 2008-10-10T15:16:57.773 に答える