SQL Server唯一列ID

时间:2016-05-30 23:57:26

标签: sql-server

我正在开发一个应用程序,我们将用它来维护我们的数据库字典(每个表中每列的描述),并希望构建一个" Refresh"可以进入数据库并获取更新的列列表/名称的函数。

我遇到的问题是重命名/移动列时,我想跟踪是否有方法使用新的详细信息更新数据库。我尝试使用Column_ID中的syscolumns,但是当列移动时这会发生变化,因此似乎是一个任意数字。

SQL Server是否为不会更改的列生成任何唯一ID?

我的另一种方法是添加新列并将旧列标记为已删除。

由于

3 个答案:

答案 0 :(得分:1)

为什么不将描述存储在列的description属性中。然后,当列更新时,开发人员将负责更新此列。

10多年前我写了一个web字体结尾....如果你愿意,我可以发给你代码吗?看起来像:

enter image description here

答案 1 :(得分:0)

我会添加一个新列并将旧列标记为已删除。

[edit]

我认为SQL服务器删除了表并首先创建了它,在你提出问题之后我去调查:

如果您选择“禁止保存需要创建表格的更改”选项(在选项 - >设计师 - >表和数据库设计器中),然后创建下表:

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

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)

然后运行上面的代码,你会得到: INSERT INTO dbo.testTbl VALUES ('text1', 12) ,('text2', 22) ,('text3', 32) ,('text4', 42) ,('text5', 52)

您将获得以下值: enter image description here

如果您现在尝试执行以下更改(在表设计器中),您将发现所有需要删除并从数据库重新创建:
将NULLABLE列更改为不可为空的
将不可为空的列更改为可空的 (这是预期的;这些更改需要列在页面上移动)
更改列的数据类型(nchar(10)更多或更少,smallint更改为tinyint或int)
但是如果要将列从B更改为C,SQL可以对其进行管理,结果将为:

enter image description here

对象id引用表id,因此表保持相同的对象id。

答案 2 :(得分: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'

您可以生成列名称的HashCode并将其与object_id组合...除非列名更改,否则该列表应该是唯一的

希望这会有所帮助。