在我的情况下,脚本可能会多次运行(不要问为什么)。
所以我想在prod运行之前让我的脚本子弹证明。
我在添加FILESTREAM功能方面有了很大的改变。通过启用FILESTREAM,更改数据库以添加文件流文件组,然后将文件位置添加到该文件组,最后在数据上创建包含文件流的表,我已经使用必要的脚本在我的开发环境中工作了column(varbinary(MAX))。
这一切都很好。但是,如果文件组已经存在,则多次运行ALTER DATABASE脚本会产生错误。所以我这样做了......
IF NOT EXISTS (SELECT * FROM sys.filegroups WHERE [name]='NewFileGroup')
BEGIN
ALTER DATABASE [MyDb]
ADD FILEGROUP [NewFileGroup] CONTAINS FILESTREAM
END
GO
但代码的下一部分是我不想多次运行的部分......
DECLARE @Path NVARCHAR(MAX)
SET @Path = (SELECT REPLACE(filename, 'MyDb.mdf', 'NewFileGroup') FROM sysfiles WHERE Name = 'PrimaryFileName')
DECLARE @SQL NVARCHAR(max)
SET @SQL =
'ALTER DATABASE [MyDb]
ADD FILE
(NAME = ''NewFileGroup''
, FILENAME = ' + QuoteName( @Path, '''' )
+ ')
TO FILEGROUP [NewFileGroup]'
EXEC(@SQL)
该代码工作正常,但我如何检查该文件组中是否已存在FILENAME /文件路径?请有人帮忙。我只是想围绕它做另一个if声明。
答案 0 :(得分:3)
要查看您是否已在sys.data_spaces
查看FILESTREAM的文件组:
select * from sys.data_spaces where type='FD';
要查看文件组是否有任何FILESTREAM文件,请查看sys.database_files
:
select * from sys.database_files where type = 2;
无论你做什么,不依赖于对象名称。
答案 1 :(得分:1)
或者从SQL Server 2012及更高版本开始,此查询将列出所有已启用非事务性访问权限的数据库,即FileStream。
SELECT DB_NAME(database_id) [DB_Name],directory_name [FileStream_DirectoryName]
FROM sys.database_filestream_options
WHERE non_transacted_access != 0;
有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/gg492071.aspx