小编mar*_*c_s的帖子

在 SELECT 中处理多个 CASE 语句的有效方法

我运行了一份报告,在该报告中,我遇到了一种情况,即基于基本上是键或 Id 的列值,我需要从映射 Id 表中获取相应的值。像下面这样:

    SELECT
     (case when [column1='A'] then (select value from Table1) 
           when [column1='B'] then (select value from Table2) 
           when [column1='C'] then (select value from Table3)

           and so on uptil 35 more 'when' conditions ...

  ELSE column1 end) Value 
from Table1
Run Code Online (Sandbox Code Playgroud)

更确切地说:

SELECT 
(case when [A.column1='1'] 
then (select value from B where B.clientId=100 and A.column1=B.Id) 
when [A.column1='2'] 
then (select value from C where C.clientId=100 and A.column1=C.Id) 
when [A.column1='3'] 
then (select value from D where D.clientId=100 and A.column1=D.Id) 
... …
Run Code Online (Sandbox Code Playgroud)

sql-server sql-server-2016

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

用于创建表的 SQL Server 数据库级角色

有没有办法创建或更改用于创建表的特殊角色?我们的软件开发团队db_datareaderdb_datawriter角色,但他们不能创建新表。

我阅读了与数据库级角色相关的这篇文章我不想授予db_ddladmin角色,因为此角色的权限太多。

所以我的问题是如何为数据库提供创建和删除表的权限?视图、过程和函数也可以。我所需要的只是我不想授予与安全、登录或备份操作相关的权限。

sql-server permissions role

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

Oracle监控数据库状态

我正在寻找一种通过执行 SQL 查询的 PHP 脚本来监视 Oracle 数据库状态(运行状况)的方法。有包含实际连接数、会话数、工作负载等的系统变量......

我如何访问这些值:通过常规SELECT语句或内置存储过程,或者它需要是自定义构建存储过程...

在获得这些值后,我如何检测它是否是正常的、繁重的、极端的工作负载。标准是什么?

oracle monitoring

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

如何使用 SQL Server Management Studio 将数据库从一台服务器移动到另一台服务器?

我需要移动一个数据库,但我想确保我安全地完成它并使用所有触发器、存储过程和函数。

我认为只需使用 SQL Server Management Studio 将数据库从我的服务器上分离,然后将.mdf.ldf文件移动到新目录并将其附加到新服务器。

有人可以指导我吗?

sql-server-2008 sql-server ssms

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

诊断 SQL Server 中的慢 SQL

我不是 DBA 所以请耐心等待我...

是否可以在 SQL Server 上打开跟踪,它会告诉我执行时间超过 2 秒的任何 SQL 语句、它发生的时间以及 SQL 是什么?是否可以将时间设置为 2, 3 , 4 ,无论如何...?

谢谢

sql-server-2008 sql-server

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

SQL Server:为什么不对 ANSI_NULLS 使用默认数据库设置?

我遇到过一个客户遇到此错误的情况 - 偶尔会出现:

消息 8624,级别 16,状态 21,第 1 行
内部查询处理器错误:查询处理器无法生成查询计划。有关更多信息,请联系客户支持服务。

他们正在使用我们的软件,并在 SQL Server 2008 R2 (RTM) 和兼容性级别 100 (SQL Server 2008) 上运行它。然而,该数据库最初是在 2000 年或 2005 年的机器上创建的(无法再复制),然后最近移至 2008 R2。

有问题的存储过程有一个看起来很丑的INSERT语句,它从给定表的十个(是的!)“副本”中获取数据,所有这些都相互连接RIGHT OUTER JOIN(同一个表 - 十个与之相对的 JOIN)。

我发现似乎最合适的一种解决方案与各种设置有关 - 建议使用:

set ANSI_NULLS ON
set ANSI_PADDING ON
set ANSI_WARNINGS ON
set CONCAT_NULL_YIELDS_NULL ON
set QUOTED_IDENTIFIER ON
set ARITHABORT ON

set NUMERIC_ROUNDABORT OFF 
Run Code Online (Sandbox Code Playgroud)

好的 - 当然 - 我可以在我创建(或更改)的每个存储过程之前设置这些。

我向数据库专家提出的问题是:将这些设置为我的数据库的默认设置有什么风险吗?

例如

ALTER DATABASE MyDB SET ANSI_NULLS ON
Run Code Online (Sandbox Code Playgroud)

并完成它?想法?见解?推荐?

sql-server-2008-r2

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

将复制 SQL Server 2008 发布者与 SQL Server 2012 订阅者合并

这是否有可能让 SQL Server 2008 发布者与 SQL Server 2012 订阅者进行合并复制?

replication sql-server-2008 sql-server-2012 merge-replication

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

SQL Server - 事务和事务日志如何工作(简化)

我有一个关于交易如何运作的理论,但如果可能的话,我希望有人可以验证它或纠正一些观点。假设我们有一个具有完整恢复模型的数据库。

现在,发生在数据库上的所有事情都首先记录到事务日志中,在到达检查点后写入磁盘。

如果我在一个显式事务中,对数据库的所有更改都会首先写入日志,但在检查点期间未提交的事务不会传播到磁盘。

如果我决定回滚事务,只需删除所有事务日志条目即可完成回滚。

如果我提交,则在下一个检查点更改后写入磁盘。

事务日志包含有关如何重做操作的说明,而不是如何撤消操作的说明,这就是为什么只能从基线备份向前恢复到时间点,而不能向后恢复的原因。

它可以从一些操作及其关于如何撤消它的重做指令中推导出来(但不是全部)。这就是商用工具如何使用事务日志恢复完整恢复模型数据库中的数据。

我的所有观点至少在某种程度上有效吗?有人可以发表评论吗?这是我关于探索事务和事务日志如何在 SQL Server 中工作的第三个也是最后一个问题。谢谢。

编辑:

简单的测试似乎反驳了我的理论,因为即使在插入 1000000 行的事务中(数据库没有其他任何内容),SQL Server 似乎也会写入主数据文件。我感到困惑和悲伤:)

sql-server transaction transaction-log

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

在 SQL Server 中使用范围按百分比查找最高值

按百分比范围对记录进行分组的更简单方法是什么。

这是我试图完成的

Select top percents between 50 and 75 * from myTable order by PKI
Run Code Online (Sandbox Code Playgroud)

这是我这样做的方式,但我觉得它云要容易得多

select 
    top(25) percent 
     *
from myTable
where id not in (
            select 
                top(25) percent 
                 ID
            from myTable
            order by PKI
            )
order by PKI
Run Code Online (Sandbox Code Playgroud)

这应该是我表的前 50-75% 吗?

有没有更好(更好)的方法来做到这一点。

sql-server t-sql sql-server-2008-r2

3
推荐指数
2
解决办法
1093
查看次数

SQL Server 代理 - 在每个月末使用日期变量运行查询

我正在运行 SQL Server 2008 R2,我需要创建一个新作业,该作业基本上会在每个月初(每个月 1 日上午 01:00)运行查询。

这是查询:

INSERT INTO [SupportTracker].[dbo].[DashboardRecords]
SELECT [bg_id]
      ,[bg_short_desc]
      ,[bg_reported_date]
      ,[bg_status_updated_date]
      ,[us_firstname]
      ,[us_lastname]
      ,[LastUpdatedUserFirstname]
      ,[LastUpdatedUserLastname]
      ,[st_name]
      ,[pr_name]
      ,[ct_name]
      ,[pj_name]
      ,[AssignedUserFirstname]
      ,[AssignedUserLastname]
      ,[bg_project]
      ,[no_of_hours]
      ,[BugType]
      ,[SubType]
      ,[Device]
      ,[pj_parent_id]
FROM [SupportTracker].[dbo].[ViewIssueListwBugTypeNDevice]
WHERE 
     bg_reported_date between '2012-12-01 00:00:00.000' AND '2012-12-31 23:59:59.999' 
     AND bg_id NOT IN (SELECT bg_id FROM [SupportTracker].[dbo].[DashboardRecords])
ORDER BY bg_reported_date ASC
Run Code Online (Sandbox Code Playgroud)

我的问题是在WHERE条款上。这两个日期每个月都必须更改。

  • 如果我们在01-01-2013 01:00:00:00,我需要这两个日期:
    2012-12-01 00:00:00.0002012-12-31 23:59:59.999

  • 如果我们在01-02-2013 01:00:00:00,我需要这两个日期是:
    2013-01-01 00:00:00.0002013-01-31 23:59:59.999

基本上我需要捕获数据库的一部分并将其保存在表中,就像每个月末一样......

谢谢

sql-server sql-server-2008-r2 sql-server-agent

3
推荐指数
2
解决办法
6226
查看次数