我正在處理一個應用程序,我們將使用它來維護我們的數據庫字典(每個表中的每個列的描述),並且想要構建可以轉到數據庫的「刷新」獲取更新的列表/名稱。SQL Server唯一列ID的
我遇到的問題是當列被重命名/移動時,我想跟蹤是否有方法用新的細節更新數據庫。我嘗試使用 syscolumns
,但是當列被移動時,這個變化似乎是任意數字。
SQL Server爲沒有更改的列生成任何唯一標識嗎?
我的替代方案是添加新列,並將舊列標記爲已刪除。
謝謝
我正在處理一個應用程序,我們將使用它來維護我們的數據庫字典(每個表中的每個列的描述),並且想要構建可以轉到數據庫的「刷新」獲取更新的列表/名稱。SQL Server唯一列ID的
我遇到的問題是當列被重命名/移動時,我想跟蹤是否有方法用新的細節更新數據庫。我嘗試使用 syscolumns
,但是當列被移動時,這個變化似乎是任意數字。
SQL Server爲沒有更改的列生成任何唯一標識嗎?
我的替代方案是添加新列,並將舊列標記爲已刪除。
謝謝
我會添加一個新列,並將舊列標記爲已刪除。
[編輯]
我認爲什麼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'
您將獲得以下值:如果你現在做了以下變化(表設計器),你會發現,所有需要降
和從數據庫重新創建:
將NULLABLE列更改爲不可爲空
將不可空列更改爲可爲空
(這是預期的;這些更改需要列在頁面中移動)
將列(nchar(10)的數據類型更改爲更多或更少,smallint更改爲tinyint或int)
但如果要將列從B更改爲C, SQL可以管理它,其結果將是:
對象ID參照表的ID,所以表留在了同一個對象ID。
謝謝。我不希望有額外的列,並且已經將其添加到SQL中的擴展屬性函數中。這使我可以在我的應用程序和SQL服務器管理器中看到細節。 –
你可以試試這個...它的兩個查詢的複合:
這將讓你在表內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
結合...應該是唯一的,除非列名更改
希望這會有所幫助。
謝謝,不幸的是,有時列名會改變,這是我正在爭取的問題。 –
沒有語法來移動列。如果你這樣做,SSMS會丟棄並重新創建整個表格。 –
謝謝,我認爲情況會如此。我只是想看看是否可能有一個獨特的項目分配給我可以檢查的列。 –