2012-05-02 4 views
-1

私はある数の列を持つテーブルを持っています。どのように動的に列を生成するのですか?

私はtable2の動的の列として表1の特定の列のデータを他のテーブルを移入します。私は動的に言うとき

私が今までにどのようなデータが表1の列に追加されたときにtable2のは列のように多くの数が移入されたと言うことを意味します。その場でスキーマを変更する

+1

あなたが実際に何をしようとして明確ではありませんので、ご質問を手直ししてください。どのようにASP.NETに関連していますか? –

+0

Table1に追加された新しいデータをTable2に追加するか、Table1に新しい列を追加すると自動的に同じ列がTable2に追加されるはずですか? (列はメタデータであり、データではなく、明らかにするのに役立ちます)。 –

+0

私にはっきりさせてください。表1と表2の2つの表があります。 Table1に 'Description'という列があります。ユーザーは3行を追加してA、B、Cと答えます。これらの3つの値をTable2に列として追加するストアドプロシージャを作成して、Table2に列としてA、B、Cがあるようにします。これは、ユーザーがTable1の説明列に任意のデータを追加するときに、そのデータがtable2の列として表されるように、動的に実行する必要があります。 – user1226569

答えて

1

は本当にいくつかの理由のために、良いアイデアではありません。あなたが説明したことから、私はあなたがこれについてのビューを使う方が良いと思う。ビューは、より少ない副作用で、探している動的な機能を提供します。

この記事を参照してください。 How to create a view in SQL Server

1

何でも根本的な問題へのよりよい解決策は、あなたがそこにいる私は、再び多くの物事がうまくいかないことができ、これは悪い考えです免責条項を繰り返すことになります、と私は確信しています」解決しようとしている。つまり、明示的な質問に答えるために、これを行う方法の例を次に示します:

USE tempdb; 
GO 
CREATE TABLE dbo.Table1(Description VARCHAR(32)); 

CREATE TABLE dbo.Table2(ID INT); 

GO 
CREATE TRIGGER dbo.CatchNewTable1Data 
ON dbo.Table1 
FOR INSERT 
AS 
BEGIN 
    SET NOCOUNT ON; 

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

    SELECT @sql += CHAR(13) + CHAR(10) + 
     'ALTER TABLE dbo.Table2 ADD ' 
     + QUOTENAME(d) + ' VARCHAR(255);' -- guessing on destination data type 
    FROM 
    (
     SELECT DISTINCT d = LEFT([Description], 128) -- identifier <= 128 
     FROM inserted AS i 
     WHERE NOT EXISTS 
     (
      SELECT 1 FROM sys.columns 
      WHERE name = LEFT(i.[Description], 128) 
      AND [object_id] = OBJECT_ID('dbo.Table2') 
     ) 
    ) AS x; 

    EXEC sp_executesql @sql; 
END 
GO 

今すぐ試してみましょう!すでに存在する列、列の1つがすでに存在する複数行の挿入、複数行の挿入(dupes)などを試してください。値が255を超えていないことを確認してください。また、問題。どうして?最終的に私はあなたにこのソリューションを使用させたくないので、私は本当の問題を解決したいと思います。しかし、Google社員には、問題の解決策があることを示したいと思います。

-- does nothing: 
INSERT dbo.Table1 SELECT 'ID'; 

-- only adds column 'foo': 
INSERT dbo.Table1 SELECT 'ID' 
UNION ALL SELECT 'foo'; 

-- adds both of these columns: 
INSERT dbo.Table1 SELECT 'bar' 
UNION ALL SELECT 'splan foob'; 

-- only adds one of these: 
INSERT dbo.Table1 SELECT 'blat' 
UNION ALL SELECT 'blat'; 

SELECT * FROM dbo.Table2; 

結果:

ID   foo   bar   splan foob blat 
----------- ------------ ------------ ------------ ------------ 

は、クリーンアップすることを忘れないでください:

DROP TABLE dbo.Table1, dbo.Table2; 
関連する問題