2012-05-02 200 views
-1

我有一定數量的列的表。如何動態生成列?

我想填充其他表與表1 作爲表2動態的列的特定列的數據。

當我說我動態的意思是說,當以往的任何數據添加到表1列的表2填充儘可能多的列數。

+1

請返工你的問題,因爲目前尚不清楚你實際上要怎樣做。它與ASP.NET有什麼關係? –

+0

你是說添加到Table1的新數據應該被添加到Table2中,或者當一個新列被添加到Table1時,同一列應該被自動添加到Table2中? (一列是元數據,而不是數據,只是爲了幫助澄清。) –

+0

讓我澄清:讓我們說我們有2個表格Table1和Table2。表1有一個說''描述'的列。現在用戶添加3行到它說A,B,C。現在我想我應該寫一個存儲過程,將採取這3個值並將這些值作爲列添加到table2,以便Table2具有A,B,C作爲列。這應該是動態完成的,以便當用戶向Table1的描述列添加任何數據時,數據在表2中以列表示。 – user1226569

回答

1

由於多種原因,動態更改模式並不是一個好主意。從你描述的內容來看,我認爲你最好使用這個視圖。視圖將爲您提供您正在尋找的動態功能,同時減少副作用。

看到這篇文章: How to create a view in SQL Server

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;