2016-03-22 8 views
1

私は約20の異なるテーブルを持つ単純なDBを持っています。複数のテーブルを変更するSQL Server

"Report Date"という名前のテーブルにすべて列を追加し、値をmm-yyyyにしたいとします。

私はこのクエリを使用することにより、一度に一つのテーブルにそれを行うことができます。

USE [RSA] 
GO 
ALTER TABLE [dbo].[RSA_BIRMINGHAM_1941$] 
ADD [month] nvarchar(255); 

しかし、私は一度にすべてを変えることができれば容易になるだろう。

+2

で変更する必要があります文字列を入力して実行します。おそらく、20テーブルのための過剰な、そしてあなたが1000テーブルを持っていれば、あなたのデータベースを扱うための多くの他の戦略が必要になります。私の指摘は、この場合カット/コピー/ペーストのベストプラクティスである:-) –

+0

@RaulGonzalesでは、テーブル定義を変更する動的クエリを構築するために 'sys.tables'を使用することができます。重要なのは、テーブルにデータが含まれている場合は、新しいカラムをNULLableとして作成する必要があるということです。私の答えを見る – DhruvJoshi

答えて

0

あなたは説明

DECLARE @q nvarchar(max) 
DECLARE @c int 
SELECT @c=count(1) from sys.tables where type='U' -- add any other where condition here 
WHILE (@c>0) 
BEGIN 
select @q = 
      'ALTER TABLE ['+ 
      t.name + 
      '] ADD [month] nvarchar(255) NULL; ' 
      FROM (
       SELECT 
       name, 
       ROW_NUMBER() OVER(ORDER BY name ASC) as r 
       FROM sys.tables 
       where type='U' 
       ) t where [email protected] 

SET @[email protected] 
--PRINT(@q) 
EXEC(@q) 
END 

このダイナミッククエリを使用することができます。 私たちは私たちにすべてのテーブルの名前を提供しSYS.TABLESテーブルを使用変更する必要があります。

名前「レポート日」で始まるテーブルのみのような任意のビジネスルールを持っているなら、あなたはあなたがsysobjectsにからテーブル名を引き、および動的SQLを構築することができる2つの場所

--here 
SELECT @c=count(1) from sys.tables where type='U' and name like 'Report Date%' 
--... 
--... 
-- and here 
     FROM (
       SELECT 
       name, 
       ROW_NUMBER() OVER(ORDER BY name ASC) as r 
       FROM sys.tables 
       where type='U' and name like 'Report Date%' 
       ) t where [email protected] 
関連する問題