小编MrV*_*mes的帖子

覆盖过期集时追加备份

我一直在阅读这个,但在线文档有点难以理解,而且看起来很笨拙。例如INITNOINIT。有人说它会尝试覆盖所有内容。另一个说无论如何它都会附加。

我想要介于两者之间的东西。我希望过期的媒体集不再存在于文件中,但要让新的备份作业与尚未过期的媒体集一起附加到文件中。

下面的 SQL 会执行所需的备份吗?

BACKUP DATABASE [mydb] 
TO  DISK = N'c:\Backups\mydb.bak' 
WITH NOFORMAT, NOINIT,  NAME = N'mydb-Full Database Backup', NOSKIP, 
NOREWIND, NOUNLOAD,  STATS = 10, RETAINDAYS = 60
GO
Run Code Online (Sandbox Code Playgroud)

如果我运行上面的,并且有一个超过 60 天的备份集,它会从文件中删除吗?

编辑:

为了响应 RichardTheKiwi 的建议,我每次都重写了代码以创建一个新文件。然后我将编写一个 Windows 脚本来删除早于某个日期的文件

declare @filename varchar(max)
set @filename = 'c:\sqlbackups\pptd_' +  replace(replace(convert(varchar, getdate(), 120),':','_'),' ','_') + '.bak'
BACKUP DATABASE [Peter's pointless test database] 
TO  DISK = @filename
WITH FORMAT, INIT,  NAME = N'pptd-Full Database Backup', 
NOREWIND, NOUNLOAD,  STATS = 10 …
Run Code Online (Sandbox Code Playgroud)

sql-server backup

7
推荐指数
1
解决办法
6027
查看次数

在 varchar 列中存储 NULL 与存储 ''

我意识到这可能被标记为重复,但我特别询问 SQL Server 2005

我在互联网上阅读了相互矛盾的建议,所以我在这里问。特别是在 SQL Server 2005 中,varchar 列中的 NULL 是否与空字符串占用相同的空间?

我在另一个驱动器上构建了一个“持有”表,并用源表中的数据填充它,并且在字段为nullif([field],'')空的地方,我曾经插入空值来代替空值。

然后我构建了一个与保存表结构完全相同的新表,但我没有用 null 替换空白,而是插入了空白,到目前为止它似乎占用了更多空间(我还没有完成填充它和我无法确定它是否正在占用更多数据)

所以在我进一步填充它并最终得到一个比我想象的更大的表格之前,我最好插入空值还是空白?

编辑:

将数据从持有表迁移到新表后,新表大约大了 4gb。

表大小差异

表设计中只有两个小的差异 - 'serial_number' 字段在保持表中是 char(15) 而在目标表中是 varchar(15)。(序列号的最大长度是 14 并且有很多空值——如果我记得的话,我想大约是 3000 万),并且持有表的聚集索引有一个额外的列 - program_name..

拿着桌

USE [Temp_holding_EWS]
GO
/****** Object:  Table [dbo].[AmtoteAccountActivity_holding]    
 Script Date: 02/17/2017 20:41:32 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[AmtoteAccountActivity_holding](
    [_Date] [char](8) NULL,[Community] [varchar](10) NULL,
    [AccountNumber] [varchar](50) NULL,
    [Branch] [varchar](10) NULL,
    [Window] [varchar](3) NULL,
    [Time] …
Run Code Online (Sandbox Code Playgroud)

sql-server-2005 sql-server

7
推荐指数
1
解决办法
2万
查看次数

创建视图时无权使用“dbo”

我想创建一个user对服务器内两个数据库的访问最少的数据库。该用户将由第三方人员使用,将商业智能工具集成到我们的数据库中。他们已经指定他们只需要创建视图。

所以,我在服务器上创建一个新用户,那么使用的每个数据库的数据库属性授予他们SELECTCREATE VIEW特权数据库。

然后我使用该用户登录 SSMS,并尝试创建一个视图,但我收到一条消息说

'dbo' 要么不存在,要么我无权使用它。

我试图通过反复试验自己解决这个问题,但我只是不了解 sql server 上的用户权限。我做错了什么,我需要采取哪些额外/不同的步骤?

请记住,我不希望他们拥有比他们需要的最低限度更多的控制权。

sql-server-2005 permissions users

4
推荐指数
1
解决办法
1993
查看次数

删除固定长度的列以释放空间是否明智?

我在 SQL Server 2005 中有一个巨大的表。(该表大约 40GB)我正在寻找最安全、最轻松的方式来释放空间或延迟其增长。

该表具有三个固定长度 ( char(10)) 列,它们 a) 完全不需要,b) 几乎完全填充了NULL.

如果我删除这些列,SQL Server 是否会在导入新记录时开始使用数据文件中释放的空间?或者由于分散在许多记录上,它们的碎片性质(我假设)是否意味着 SQL Server 将出于性能原因忽略该空间?

如果我删除它们,我可以运行收缩数据库来释放空间吗?

我是唯一使用这个数据库的开发人员,我知道这些列对于需求来说是多余的。15 年前,当不同的懒惰开发人员创建此数据库时,它们与其他所有列一起添加到平面文件中。

sql-server-2005 sql-server shrink disk-space

4
推荐指数
1
解决办法
554
查看次数

试图检查一个字符串是否只包含一个数字

我一直在尝试编写一个函数来检查一个字符串是否包含一个数字,而该数字不是更大数字的一部分(换句话说,如果要搜索的数字是 '6' 而字符串是 '7+16+2'它应该返回 false,因为这个字符串中的 '6' 是数字 '16' 的一部分)

我写了下面的函数(它很长,但我打算在重构之前先测试它)

在测试时,我发现了一个错误,它仅通过逻辑运行找到的数字的第一个实例。因此,使用 '6' 对 '16+7+9+6' 运行此函数将返回 false,因为它确定第一个 '6' 是更大数字的一部分并停止处理。

我认为要解决这个问题,我必须实现一个循环来缩短 'haystack' 字符串(这样,使用示例 '16+7+9+6',该函数在消除后继续检查 '+7+9+6'第一个“6”)但在花时间使已经复杂的函数变得更加复杂之前,我想检查是否有更简单的方法来实现相同的目标?

drop function dbo.runners_contain_runner
go
create function dbo.runners_contain_runner(@runner varchar(max), @runners varchar(max))
returns int
as 
begin

    /*
    eliminate the plus sign from @runners so that the 
    'isnumeric' function doesn't return false positives (it returns 1 for '+') 
    */
    set @runners = replace(@runners,'+','_' ) 


    declare @ret int;
    set @ret = 0;

    -- if the runner is the only runner return …
Run Code Online (Sandbox Code Playgroud)

sql-server-2005 sql-server t-sql pattern-matching substring

3
推荐指数
1
解决办法
2420
查看次数