我有一定数量的列的表。
我想用Table1的特定列的数据动态填充其他表作为table2的列。
当我说动态时,我的意思是说,当任何数据添加到Table1的列时, table2都会填充尽可能多的列。
我有一定数量的列的表。
我想用Table1的特定列的数据动态填充其他表作为table2的列。
当我说动态时,我的意思是说,当任何数据添加到Table1的列时, table2都会填充尽可能多的列。
出于多种原因,动态更改架构确实不是一个好主意。根据您的描述,我认为您最好为此使用视图。视图将为您提供您正在寻找的动态功能,并且副作用更少。
请参阅这篇文章: 如何在 SQL Server 中创建视图
我将再次重复声明,这是一个坏主意,很多事情都可能出错,而且我确信对于您要解决的任何潜在问题都有更好的解决方案。也就是说,无论如何要回答明确的问题,以下是如何执行此操作的示例:
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;