特定の数の列を持つテーブルがあります。
Table1の特定の列のデータを、 table2の列として動的に他のテーブルに入力したいと考えています。
動的に言うと、Table1の列にデータが追加されるたびに、table2には同じ数の列が取り込まれるということです。
特定の数の列を持つテーブルがあります。
Table1の特定の列のデータを、 table2の列として動的に他のテーブルに入力したいと考えています。
動的に言うと、Table1の列にデータが追加されるたびに、table2には同じ数の列が取り込まれるということです。
これは悪い考えであり、多くのことがうまくいかない可能性があるという免責事項をもう一度繰り返します。あなたが解決しようとしている根本的な問題には、より良い解決策があると確信しています。とにかく、明示的な質問に答えるために、これを行う方法の例を次に示します。
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;
オンザフライでスキーマを変更することは、いくつかの理由から、実際には良い考えではありません。あなたが説明したことから、これにはビューを使用する方が良いと思います。ビューを使用すると、探している動的な機能をより少ない副作用で提供できます。
この記事を参照してください: SQL Server でビューを作成する方法