我有一定数量的列。
我希望动态填充其他表格,其中包含 Table1 的特定列的数据作为 table2 的列。
当我动态地说,我的意思是说,当任何数据被添加到 Table1 列时, table2 会填充多少列。
答案 0 :(得分:1)
出于多种原因,动态更改架构确实不是一个好主意。根据您的描述,我认为您最好使用视图。视图将为您提供所需的动态功能,减少副作用。
答案 1 :(得分: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
现在,让我们来试试吧!尝试一个已经存在的列,一个已存在其中一列的多行插入,一个带有欺骗的多行插入等。我没有发布值&gt; 255我也不会处理会导致问题的任何花哨字符。为什么?因为最终我不想让你使用这个解决方案,我想解决真正的问题。但对于googlers,我想表明解决了所述问题。
-- 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;