小编Rac*_*hel的帖子

如何确定何时创建新表来保存可以从查询中获取的数据?

我们有一张付款表,代理商会收到付款佣金。佣金取决于几个不同的因素,例如收到付款需要多长时间,因此在计算代理获得的佣金率时会涉及一些计算,但并不复杂。

例如,它可能永远不会比这更复杂:

SELECT Payments.Amount * CASE 
    WHEN DateDiff(year, Client.Received, Payments.DatePaid) = 1 THEN Rates.Rate1
    WHEN DateDiff(year, Client.Received, Payments.DatePaid) = 2 THEN Rates.Rate2
    ELSE Rates.Rate3 END
Run Code Online (Sandbox Code Playgroud)

构建第二个表来保存这些数据而不是在需要时随时查询是否有意义?或者我应该坚持使用在请求时提取数据的运行时查询?

更重要的是,在确定是否应该在需要数据的任何时候运行查询,或者数据是否应该存储在它自己的单独表中时,要使用哪些因素?

performance sql-server-2005 sql-server query-performance

8
推荐指数
2
解决办法
357
查看次数

是否有更简洁的方法将 UTC 日期时间仅转换为本地日期?

我正在尝试编写一个查询,该查询仅根据 UTC 日期时间字段的本地日期部分对记录进行分组。

例如,如果我的表包含10/19/2012 2:00:00,那么它应该被分组为10/18/2012,因为我的本地时间是美国东部时间 (-5h) 并且我只对字段的日期部分感兴趣。

我知道我DateAdd(day, DateDiff(day, 0, MyDate), 0)只能从日期时间字段中获取日期部分,我可以DateAdd(minute, DateDiff(minute, GetUtcDate(), GetDate()), MyUtcDate)用来将 UTC 日期时间转换为本地日期时间。

但是将两者结合起来严重冒犯了我。

在 SQL Server 2005 中,是否有比这更好的方法来获取 UTC 日期时间字段的日期部分,转换为本地时间?

  SELECT DateAdd(day, DateDiff(day, 0, DateAdd(minute, DateDiff(minute, GetUtcDate(), GetDate()), MyUtcDate)), 0)
       , Count(*)
    FROM MyTable
GROUP BY DateAdd(day, DateDiff(day, 0, DateAdd(minute, DateDiff(minute, GetUtcDate(), GetDate()), MyUtcDate)), 0)
Run Code Online (Sandbox Code Playgroud)

sql-server-2005 sql-server query-refactor

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

Month(date) 和 DatePart(month, date) 之间有什么显着区别吗?

MSDN 声明Month(date)DatePart(month, date)返回完全相同的值,但是这两种方法,性能或其他方面有什么区别吗?

我正在构建一些基于月份聚合大量数据的查询,有时它们需要一段时间才能运行,所以我想确保我使用的是最有效的语法。

我目前使用的是 SQL Server 2005

sql-server-2005 sql-server

6
推荐指数
1
解决办法
3508
查看次数

有没有办法设置用户运行 SP,但不能访问底层数据表?

我们在链接的两个独立服务器上有两个数据库实例。网站用户需要能够在 DatabaseA 上运行查询 DatabaseB 表的存储过程,但是它不应该能够直接从 DatabaseB 上的表中读取。

在 Sql Server 2005 中可以实现这样的事情吗?

简单地创建一个存储过程并授予 Web 用户执行它的权限会返回错误 Access to the remote server is denied because no login-mapping exists.

我真的不想让网站用户帐户免费访问 DatabaseB 表。

更新

Aaron 的使用建议EXECUTE AS OWNER不起作用,因为Owner无法访问 DatabaseB。

使用会EXECUTE AS 'UserWithPermissions'返回错误Access to the remote server is denied because the current security context is not trusted。在线查找这个让我相信这是因为数据库没有标记为TRUSTWORTHY,所以远程数据库拒绝连接。我怀疑如果两个数据库实例在同一台服务器上它会正常工作。

我不想设置 web 数据库,TRUSTWORTHY因为它的一些安全性更宽松,所以我选择了 Aaron 的另一个选项:创建一个DatabaseB只能访问包含网站应访问数据的特定视图的用户,然后进入链接服务器对象上的安全属性并设置网站用户在访问链接服务器时以新的受限用户身份登录。

这允许我的网站用户对私有数据库中的特定数据具有有限的访问权限,而不能访问任何基础表。

sql-server-2005 stored-procedures permissions linked-server

6
推荐指数
1
解决办法
1333
查看次数

我可以将#temp 表的表结构复制到新的物理表吗?

我有一个#tempTable使用创建的

SELECT *
INTO #tempTable
FROM OPENROWSET('Microsoft.Ace.OLEDB.12.0', 'Excel 8.0;Database=MyFileName.xls', 
'SELECT * FROM [Sheet1$]')
Run Code Online (Sandbox Code Playgroud)

有没有一种简单的方法可以将 的表结构复制#tempTable到新的物理表?

临时表包含许多包含数字、日期、小数和字符串的列,我不想识别和手动定义每一列。

我正在使用 SQL Server 2005

sql-server-2005 sql-server temporary-tables

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

在 IsDeleted/DateDeleted 列或单独的历史记录表之间做出决定?

我们有一个表,只存储一个AccountId, TagId, 和DateCreated。用户可以更新帐户上的标签,从而在此表中添加或删除记录。一个帐户上不能存在多个标签,但可以多次添加和删除相同的标签。此表主要用于用户构建的查询中,以使用标签表JOINEXISTS标签表过滤帐户。

我被要求开始记录标签历史记录,我正在尝试决定使用现有表上的IsDeleted和/或DateDeleted列是否更好,或者我是否应该创建一个单独的历史记录表来存储这些数据。

跟踪历史记录的主要目的是在特定时间点运行报告。例如,获取 2013 年 1 月期间带有 TagA 的帐户的数据。

在尝试在两者之间做出决定时,我应该考虑哪些因素?

database-design sql-server

5
推荐指数
1
解决办法
2193
查看次数

如何在存储过程的全文中搜索值?

当我想查找特定值时,我使用以下脚本来搜索所有存储过程的文本。

SELECT ROUTINE_NAME, ROUTINE_TYPE
FROM INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_DEFINITION LIKE @searchText
ORDER BY ROUTINE_NAME   
Run Code Online (Sandbox Code Playgroud)

我最近发现ROUTINE_DEFINITION在 4000 个字符后停止,所以一些程序没有在应该返回的时候返回。

如何查询存储过程的全文以获取值?

sql-server-2005 sql-server stored-procedures information-schema

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

决定何时扩展到子表

我有一个实体表。例如目的,让我们称他们为VehiclesCarBoatMotercycle,等。

我最想要的,将所有的实体在一个单一的Vehicles表,因为有很多相关的表(中VehicleRatingsVehicleCommentsVehicleHistory,等)都将适用于任何实体,而不只是其中之一。

但是某些实体具有一些不与其他实体类型共享的单独属性。目前,一个实体只有 1 个额外属性,另一个实体则有 2 个额外属性。我希望以后可能会发现更多,但总体而言并不多。

我怎么知道什么时候最好为每个实体类型创建一个子表来存储这些单独的属性,而不是在父Vehicles表中添加一个额外的列?我有什么问题可以问自己来帮助确定这个答案吗?

我希望主要针对查询性能进行优化,其次是易于维护。

database-design

5
推荐指数
1
解决办法
1396
查看次数

在决定将逗号分隔的字符串传递给存储过程而不是按记录单独调用它时,我应该考虑什么?

我必须为大量记录(数百或数千,取决于用户选择)运行相同的存储过程。该过程相当基本:在两个单独的表中插入一条记录,其中包含一些计算值,并可选择更新第三个表上的两列。

我的应用程序有一个List<T>记录,我正在尝试决定是否应该遍历列表并在每条记录上运行该过程,或者将 id 值组合成单个字符串并进行单个数据库调用。如果我进行单个数据库调用,那么 SQL 将负责将逗号分隔的字符串转换为临时表并同时在所有记录上运行脚本。

我倾向于将逗号分隔的 Id 字符串传递给程序,但我不确定这是否是进行这种大规模更新的理想方式,或者我是否遗漏了一些会影响此决定的关键因素.

在决定是否应该将逗号分隔的 id 字符串传递给存储过程而不是按记录单独调用它时,我应该考虑什么?或者有没有更有效的方法来从应用程序进行这种更新?

我正在使用 SQL Server 2005 和实体框架

performance sql-server-2005 stored-procedures entity-framework

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

是否可以将 WITH INIT 用于我的事务日志备份以避免它变得太大?

我仍在努力理解 SQL 的备份作业。

我们目前有一个使用完整恢复模型的 SQL Server 2005 实例。

我们每周进行一次完整的数据库备份。

BACKUP DATABASE [MyDatabase]
TO DISK = N'E:\Database Backups\MyDatabase.Bak'
WITH INIT, NAME = N'MyDatabase.Bak'
Run Code Online (Sandbox Code Playgroud)

每天一次差异备份

BACKUP DATABASE [MyDatabase]
TO DISK = N'E:\Database Backups\MyDatabase_Diff.Bak'
WITH INIT, DIFFERENTIAL, NAME = N'MyDatabase_Diff.Bak'
Run Code Online (Sandbox Code Playgroud)

现在我试图弄清楚如何每小时安排事务日志备份,所以我们最多会损失一个小时的工作。

BACKUP LOG [MyDatabase]
TO DISK = N'E:\Database Backups\MyDatabase_Log.Bak'
Run Code Online (Sandbox Code Playgroud)

我的问题是,我们的存储空间有限,我不希望日志文件变得太大。我可以使用WITH INIT事务日志备份来强制它每小时创建一个新文件吗?或者我是否需要自上次差异备份以来的所有事务日志备份才能恢复到一天中的特定时间点?

如果我确实需要保留自上次差异以来的所有副本,有没有办法在我进行备份时告诉它重置?

sql-server-2005 backup

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

我可以将系统数据库从一个版本的 SQL Server 移动到另一个版本吗?

我们正在将数据库从一台运行 SQL Server 2005 的计算机转移到另一台运行 SQL Server 2008 的计算机上。

我正在按照此处找到的步骤操作,尝试使用所有用户登录名和服务器级权限复制主数据库,但是它告诉我无法恢复备份,因为它是由不同版本的服务器创建的.

有没有办法将master数据库从一个版本的 SQL Server复制到另一个版本的 SQL Server?

sql-server-2005 sql-server-2008 sql-server backup restore

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