我正在开发一个应用程序,我们将用它来维护我们的数据库字典(每个表中每列的描述),并希望构建一个" Refresh"可以进入数据库并获取更新的列列表/名称的函数。
我遇到的问题是重命名/移动列时,我想跟踪是否有方法使用新的详细信息更新数据库。我尝试使用Column_ID
中的syscolumns
,但是当列移动时这会发生变化,因此似乎是一个任意数字。
SQL Server是否为不会更改的列生成任何唯一ID?
我的另一种方法是添加新列并将旧列标记为已删除。
由于
答案 0 :(得分:1)
答案 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)
如果您现在尝试执行以下更改(在表设计器中),您将发现所有需要删除并从数据库重新创建:
将NULLABLE列更改为不可为空的
将不可为空的列更改为可空的
(这是预期的;这些更改需要列在页面上移动)
更改列的数据类型(nchar(10)更多或更少,smallint更改为tinyint或int)
但是如果要将列从B更改为C,SQL可以对其进行管理,结果将为:
对象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
组合...除非列名更改,否则该列表应该是唯一的
希望这会有所帮助。