SSMS未显示或脚本化FILESTREAM属性

6
我已经创建了一个带有FILESTREAM属性的列的表,就像这样:

CREATE TABLE dbo.FileStorage
(
    [ID] [uniqueidentifier] ROWGUIDCOL NOT NULL UNIQUE,
    [Filename] [nvarchar](255) NOT NULL,
    [Data] [varbinary](max) FILESTREAM NULL
)
GO

在存储过程中,我正在引用应该可用于上述Data列的PathName()函数。
CREATE PROCEDURE GetPathName
    -- Add the parameters for the stored procedure here
    @fileId uniqueidentifier,
    @filePath nvarchar(max) output
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Insert statements for procedure here
    SELECT @filePath = Data.PathName()
    FROM dbo.FileStorage
    WHERE ID = @fileId      
END
GO

然而,当我执行上述脚本创建存储过程时,SSMS打印出一个错误:“函数PathName仅适用于具有FILESTREAM属性的列。”。我确保已经打开了FILESTREAM属性(并且数据库支持FILESTREAM),并且我甚至已经向表中添加了一个文件。
当我尝试验证该列确实是FILESTREAM列时,SQL Server Management Studio并没有合作。该属性不会出现在列属性窗格中,并且当我将表脚本化时,FILESTREAM属性也不会出现。
更新:另一个奇怪之处是,我的FileStorage表永远不会出现在由SSMS智能感知提供的表列表中。
怎么回事?我如何在SSMS中操作或验证FILESTREAM属性?
2个回答

9

如果您使用SSMS表设计工具修改了表格,那么列的FILESTREAM属性将会丢失。在这种情况下,您需要重新创建该列并将现有数据复制到其中。以下是一个示例:

/* rename the varbinary(max) column
eg. FileData to xxFileData */
sp_RENAME '<TableName>.<ColumnName>', 'xx<ColumnName>' , 'COLUMN'
GO

/* create a new varbinary(max) FILESTREAM column */
ALTER TABLE <TableName>
ADD <ColumnName> varbinary(max) FILESTREAM NULL
GO

/* move the contents of varbinary(max) column to varbinary(max) FILESTREAM column */
UPDATE <TableName>
SET <ColumnName> = xx<ColumnName>
GO

/* drop the xx<ColumnName> column */
ALTER TABLE <TableName>
DROP COLUMN xx<ColumnName>
GO

3

1
我不知道哪个版本包含了这个更新,但我的SSMS版本目前是10.50.4000.0,而且SSMS现在生成的更改脚本包括FILESTREAM。因此,看起来微软已经发布了SQL Server 2008 R2的更新。 - James L.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接