2011-07-19 19 views
6

He creado una tabla con una columna que tiene el atributo FILESTREAM aplicada, así:SSMS no mostrar o FILESTREAM scripting atributo

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

En un procedimiento almacenado, estoy haciendo referencia a la función que debe PathName() estará disponible para la columna de Data arriba:

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 

Sin embargo, si ejecuto el script anterior para crear el procedimiento almacenado, SSMS imprime un error: "Nombre de ruta función sólo es válida en columnas con el atributo FILESTREAM ". Ciertamente creé la tabla con el atributo FILESTREAM activado (y la compatibilidad con filestream está habilitada en el DB), e incluso he agregado un archivo a la tabla.

Cuando traté de verificar que la columna es efectivamente una columna FILESTREAM, SQL Server Management Studio no cooperó. El atributo no aparece en el panel de propiedades de la columna, y cuando escribí la tabla, el atributo FILESTREAM no aparece.

Actualización: otra rareza es que mi tabla FileStorage no aparece en la lista de tablas presentada por SSMS intellisense.

¿Cuál es el problema? ¿Cómo puedo manipular o verificar el atributo FILESTREAM en SSMS?

Respuesta

9

Si ha utilizado SSMS Table Designer para modificar su tabla, se perderá el atributo FILESTREAM de su columna. En ese caso, debe recrear la columna y copiar los datos existentes en ella. He aquí una muestra:

/* 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

Microsoft reconoció que SSMS pierde el atributo FILESTREAM cuando se cambia una tabla a través de la SSMS diseñador de tablas: FILESTREAM settings are lost after changing field size through SSMS

A partir del 6/7/2012 se fija y programada para incluirse en "una próxima versión" ...

+1

No sé qué versión incluye la actualización, pero mi versión de SSMS es actualmente 10.50.4000.0 y SSMS ahora genera scripts de cambio que incluyen 'FILESTREAM'. Parece que Microsoft ** lanzó ** la actualización de SQL Server 2008 R2. –