2016-05-30 165 views
0

我正在處理一個應用程序,我們將使用它來維護我們的數據庫字典(每個表中的每個列的描述),並且想要構建可以轉到數據庫的「刷新」獲取更新的列表/名稱。SQL Server唯一列ID的

我遇到的問題是當列被重命名/移動時,我想跟蹤是否有方法用新的細節更新數據庫。我嘗試使用 syscolumns,但是當列被移動時,這個變化似乎是任意數字。

SQL Server爲沒有更改的列生成任何唯一標識嗎?

我的替代方案是添加新列,並將舊列標記爲已刪除。

謝謝

+0

沒有語法來移動列。如果你這樣做,SSMS會丟棄並重新創建整個表格。 –

+0

謝謝,我認爲情況會如此。我只是想看看是否可能有一個獨特的項目分配給我可以檢查的列。 –

回答

1

你爲什麼不把描述存儲在列的description屬性中。然後,當更新列時,開發人員將負責更新此列。

我在10年前寫了一個網頁字體結束符......如果你想要,我可以給你發送代碼嗎?如下所示:

enter image description here

+0

謝謝。這就是我最終做的。 (在我們當前的軟件中使用vb.net)。我認爲這最終是解決問題的最佳方式,因爲它隨後存儲在數據庫中並使用現有的功能。 如果你想發送的代碼,將不勝感激,因爲它可能會告訴我一個更好的方式來實現它(更好的編碼?) –

0

我會添加一個新列,並將舊列標記爲已刪除。

[編輯]

我認爲什麼SQL服務器上刪除該表並在第一時間創建它,你的問題後,我去調查:

如果標記阻止的」保存選項需要重新表創建的變化」(在選項 - >設計 - >表和數據庫設計師),然後創建下表:

CREATE TABLE [dbo].[testTbl](
    [colA] [nchar](10) NULL, 
    [colB] [smallint] NOT NULL 
) ON [PRIMARY] 

甚至插入一些值:

INSERT INTO dbo.testTbl 
VALUES ('text1', 12) 
,('text2', 22) 
,('text3', 32) 
,('text4', 42) 
,('text5', 52) 

再運行鱈魚從上面佑電子將獲得:

SELECT c.object_id, OBJECT_NAME(c.object_id) AS OBJECT_NAME 
    ,c.NAME AS COLUMN_NAME 
    ,t.NAME AS DATA_TYPE 
    ,c.max_length AS MAX_LENGTH 
FROM sys.all_columns c 
INNER JOIN sys.types t ON t.system_type_id = c.system_type_id 
WHERE object_name(c.object_id) = 'testTbl' 

您將獲得以下值:如果你現在做了以下變化(表設計器),你會發現,所有需要降 enter image description here

和從數據庫重新創建:
將NULLABLE列更改爲不可爲空
將不可空列更改爲可爲空
(這是預期的;這些更改需要列在頁面中移動)
將列(nchar(10)的數據類型更改爲更多或更少,smallint更改爲tinyint或int)
但如果要將列從B更改爲C, SQL可以管理它,其結果將是:

enter image description here

對象ID參照表的ID,所以表留在了同一個對象ID。

+0

謝謝。我不希望有額外的列,並且已經將其添加到SQL中的擴展屬性函數中。這使我可以在我的應用程序和SQL服務器管理器中看到細節。 –

0

你可以試試這個...它的兩個查詢的複合:

這將讓你在表內coumns名單:

SELECT c.object_id, OBJECT_NAME(c.object_id) AS OBJECT_NAME 
    ,c.NAME AS COLUMN_NAME 
    ,t.NAME AS DATA_TYPE 
    ,c.max_length AS MAX_LENGTH 
FROM sys.all_columns c 
INNER JOIN sys.types t ON t.system_type_id = c.system_type_id 
WHERE object_name(c.object_id) = 'TableName' 

您可以生成列名的哈希碼並將其與object_id結合...應該是唯一的,除非列名更改

希望這會有所幫助。

+0

謝謝,不幸的是,有時列名會改變,這是我正在爭取的問題。 –