-1

特定の数の列を持つテーブルがあります。

Table1の特定の列のデータを、 table2の列として動的に他のテーブルに入力したいと考えています。

動的に言うと、Table1の列にデータが追加されるたびに、table2には同じ数の列が取り込まれるということです。

4

2 に答える 2

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つがすでに存在する複数行の挿入、重複を含む複数行の挿入などを試してください。255を超える値を投稿したり、問題。なんで?最終的にはこのソリューションを使用したくないので、実際の問題を解決したいと思います。しかし、グーグルのために、私は述べられた問題に対する解決策があることを示したいと思います。

-- 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;
于 2012-05-02T15:31:53.403 に答える
1

オンザフライでスキーマを変更することは、いくつかの理由から、実際には良い考えではありません。あなたが説明したことから、これにはビューを使用する方が良いと思います。ビューを使用すると、探している動的な機能をより少ない副作用で提供できます。

この記事を参照してください: SQL Server でビューを作成する方法

于 2012-05-02T14:55:59.277 に答える