0

sp_MSforeachtable を使用して、名前付きの制約を持つすべてのテーブルに新しい列を追加しようとしています。

これまでのところ、私はこれを行ってきました:

USE [MYTable]
GO
exec sp_MSforeachtable 'ALTER TABLE ? ADD ChangedBy nvarchar(100) DEFAULT (suser_name()) NOT NULL'

DF_TableName_Change_51EF2864 という名前の制約名を付けたい

いろいろ試してみたところ、PARSENAME(''?'',1) がテーブルの名前を教えてくれることがわかりました。これを使用して制約名を動的に構築する方法はありますか?

Example: ... CONSTRAINT ''DF_''+PARSENAME(''?'',1)+''_CreatedBy'' DEFAULT ...

(それはうまくいかないようですが、私が望んでいることの感触をつかむためにそれを含めました。)

助けてくれてありがとう!

4

1 に答える 1

0

少し面倒ですが、列をnull許容として追加し、制約を追加し、既存の行に格納する値を決定してから、列をNOTNULLにすることで実行できます。また、サポートされていない、文書化されていないストアドプロシージャも避けたいと思います。sp_MSforeachdbの問題を発見しました(ここで回避策があります)。これがここでも現れる可能性があります。これは私がこれを達成する方法です:

DECLARE @sql NVARCHAR(MAX);
SET @sql = N'';

SELECT @sql = @sql + CHAR(13) + CHAR(10) + N'ALTER TABLE '
  + QUOTENAME(SCHEMA_NAME([schema_id])) + '.'
  + QUOTENAME(name) 
  + ' ADD ChangedBy NVARCHAR(100) NOT NULL;
ALTER TABLE '  + QUOTENAME(SCHEMA_NAME([schema_id])) + '.'
  + QUOTENAME(name) + ' ADD CONSTRAINT DF_' + name 
  + '_ChangedBy DEFAULT (SUSER_SNAME()) FOR ChangedBy;
  UPDATE ' + QUOTENAME(SCHEMA_NAME([schema_id])) + '.'
  + QUOTENAME(name) + ' SET ChangedBy = N''pre-existing'';
  ALTER TABLE ' + QUOTENAME(SCHEMA_NAME([schema_id])) + '.'
  + QUOTENAME(name) + ' ALTER COLUMN ChangedBy NVARCHAR(100) NOT NULL;'
  FROM sys.tables WHERE is_ms_shipped = 0;

PRINT @sql;
--EXEC sys.sp_executesql @sql;

(期待どおりに機能していると確信できる場合は、コメントを変更してください。PRINT出力にコマンド全体が表示されない場合があることに注意してください。使用しているテーブルの数によっては、切り捨てられる可能性があります。TOP1またはsys.tablesに対する追加のWHERE句を使用して、単一のテーブルのコマンドセットがどのようになるかを確認します。)

後で制約の名前を変更することもできます。

DECLARE @sql NVARCHAR(MAX);
SET @sql = N'';

SELECT @sql = @sql + CHAR(13) + CHAR(10) 
+ N'EXEC sp_rename N''' + c.name + ''',N''DF_' + t.name
+ '_ChangedBy'', N''OBJECT'';'
FROM sys.default_constraints AS c
INNER JOIN sys.tables AS t
ON c.parent_object_id = t.[object_id]
WHERE c.name LIKE 'DF[_]%[_]Change[_]%'
AND LOWER(c.[definition]) LIKE '%suser%';

PRINT @sql;
--EXEC sys.sp_executesql @sql;

これらのスクリプトはどちらも、のようなばかげたオブジェクト名がないことを前提としています1 of My Friend's Cool High % Table!

于 2012-08-31T17:49:48.527 に答える