将 rowguidcol 属性更改为不同的列

Joh*_*ohn 6 sql-server-2008 sql-server

在我的 SQL Server 2008 数据库中,我有一个包含两个 uniqueidentifier 列的表。

CREATE TABLE MyTable (
    Col1 uniqueidentifier rowguidcol not null,
    Col2 uniqueidentifier not null,
    AttachmentData varbinary(max) filestream null
)
Run Code Online (Sandbox Code Playgroud)

现在,我想通过将其从 Col1 移动到 Col2 来切换具有 rowguidcol 标识符的列,因此它最终会成为

CREATE TABLE MyTable (
    Col1 uniqueidentifier not null,
    Col2 uniqueidentifier rowguidcol not null,
    AttachmentData varbinary(max) filestream null
)
Run Code Online (Sandbox Code Playgroud)

当我尝试通过表设计器执行此操作时(通过设置 Col1.RowGuid = No 和 Col2.RowGuid = Yes),我收到以下错误:

- Error modifying column properties for 'Col1'.  
A table with FILESTREAM column(s) must have a non-NULL unique ROWGUID column.
Run Code Online (Sandbox Code Playgroud)

有没有办法用 rowguidcol 标识符切换列,或者我应该重命名这个表,创建一个新的,然后从旧表中复制数据?

RLF*_*RLF 9

首先,表设计器并不是所有软件中最聪明的,并且可能不会选择您期望的更改表的方法。设计者通常会创建一个新表,移动数据,然后删除原始表。但是,根据您的错误,设计师也可能不FILESTREAM精明。

但是,如果您通过ALTER命令自己尝试,您会发现 SQL Server 无法更改列以删除 rowguidcol 设置。走着瞧吧:

ALTER TABLE TABLEName ALTER COLUMN Col1 uniqueidentifier DROP ROWGUIDCOL;
Run Code Online (Sandbox Code Playgroud)

给出错误:无法更改列“Col1”,因为它是“ROWGUIDCOL”。

致谢马丁·史密斯。我忽略了 ROWGUIDCOL 运算符,它们是:

ALTER TABLE MyTable ALTER COLUMN Col1 DROP ROWGUIDCOL; 
ALTER TABLE MyTable ALTER COLUMN Col2 ADD ROWGUIDCOL;
Run Code Online (Sandbox Code Playgroud)

但是,由于参与的FILESTREAMDROP ROWGUIDCOL命令无法处理。

所以,是的,您需要创建一个新表并移动数据。