-1

我有一定数量的列的表。

我想用Table1的特定列的数据动态填充其他表作为table2的列。

当我说动态时,我的意思是说,当任何数据添加到Table1的列时, table2都会填充尽可能多的列。

4

2 回答 2

1

出于多种原因,动态更改架构确实不是一个好主意。根据您的描述,我认为您最好为此使用视图。视图将为您提供您正在寻找的动态功能,并且副作用更少。

请参阅这篇文章: 如何在 SQL Server 中创建视图

于 2012-05-02T14:55:59.277 回答
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

现在,让我们试试吧!尝试一个已经存在的列,一个已经存在一个列的多行插入,一个带有欺骗的多行插入,等等。我没有发布大于 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 回答