我正在尝试为员工时间记录完成一些报告。
我们有两个专门针对这个问题的表格。员工列在Members表中,他们每天输入他们已完成工作的时间条目并存储在Time_Entry表中。
使用 SQL Fiddle 的示例设置:http ://sqlfiddle.com/#!3/e3806/7
最终的结果我要的是一个表,表示所有的Members列中的列表,然后将展示他们的总和小时,在其他列查询的日期。
问题似乎是,如果Time_Entry表中没有特定成员的行,那么该成员现在有行。我尝试了几种不同的连接类型(左、右、内、外、全外等),但似乎都没有给我想要的,这将是(基于 SQL Fiddle 中的最后一个示例):
/*** Desired End Result ***/
Member_ID | COUNTTime_Entry | TIMEENTRYDATE | SUMHOURS_ACTUAL | SUMHOURS_BILL
ADavis | 0 | 11-10-2013 | 0 | 0
BTronton | 0 | 11-10-2013 | 0 | 0
CJones | 0 | 11-10-2013 | 0 | 0
DSmith | 0 | 11-10-2013 | 0 | 0
EGirsch | 1 | 11-10-2013 | 0.92 …Run Code Online (Sandbox Code Playgroud) 我已经从这里下载了基于 AdventureWorks 的内存示例,并遵循了随附文档中描述的所有步骤。但是,当我尝试在 SQL Server Management Studio 中运行脚本时,我收到错误消息:
多语句事务中不允许使用 ALTER DATABASE 语句
错误指向第 9 行,即:
IF NOT EXISTS (SELECT * FROM sys.data_spaces WHERE type='FX')
ALTER DATABASE CURRENT ADD FILEGROUP [AdventureWorks2012_mod]
CONTAINS MEMORY_OPTIMIZED_DATA
GO
Run Code Online (Sandbox Code Playgroud)
由于这是(或多或少)微软官方文档,我假设这是我做错的事情,但我无法弄清楚它是什么。
今天,我试图在现有数据库上恢复数据库,我只需在 SSMS --> 任务 --> 脱机中右键单击该数据库,以便我可以恢复数据库。
一个小的弹出窗口出现并显示Query Executing.....了一段时间,然后抛出一个错误说Database is in use cannot take it offline。我从中收集了一些与该数据库的活动连接,因此我尝试执行以下查询
USE master
GO
ALTER DATABASE My_DatabaseName
SET OFFLINE WITH ROLLBACK IMMEDIATE
GO
Run Code Online (Sandbox Code Playgroud)
再次在这一点上 SSMS 显示Query Executing.....了一段时间,然后抛出以下错误:
Msg 5061, Level 16, State 1, Line 1
ALTER DATABASE failed because a lock could not be placed on database 'My_DatabaseName'. Try again later.
Msg 5069, Level 16, State 1, Line 1
ALTER DATABASE statement failed.
Run Code Online (Sandbox Code Playgroud)
在此之后,我无法通过 SSMS 连接到数据库。当我尝试使用 SSMS 将其离线时,它抛出了一个错误:
Database is …Run Code Online (Sandbox Code Playgroud) 我正在解决一个死锁问题,同时我注意到当我在 id 字段上使用聚集和非聚集索引时,锁定行为是不同的。如果将聚集索引或主键应用于 id 字段,则死锁问题似乎已解决。
我有不同的事务对不同的行进行一次或多次更新,例如事务 A 只会更新 ID=a 的行,tx B 只会接触 ID=b 的行等。
而且我了解到,如果没有索引,更新将获取所有行的更新锁,并在必要时转换为排他锁,这最终会导致死锁。但是我没有找到为什么使用非聚集索引,死锁仍然存在(虽然命中率似乎下降了)
数据表:
CREATE TABLE [dbo].[user](
[id] [int] IDENTITY(1,1) NOT NULL,
[userName] [nvarchar](255) NULL,
[name] [nvarchar](255) NULL,
[phone] [nvarchar](255) NULL,
[password] [nvarchar](255) NULL,
[ip] [nvarchar](30) NULL,
[email] [nvarchar](255) NULL,
[pubDate] [datetime] NULL,
[todoOrder] [text] NULL
)
Run Code Online (Sandbox Code Playgroud)
死锁跟踪
deadlock-list
deadlock victim=process4152ca8
process-list
process id=process4152ca8 taskpriority=0 logused=0 waitresource=RID: 5:1:388:29 waittime=3308 ownerId=252354 transactionname=user_transaction lasttranstarted=2014-04-11T00:15:30.947 XDES=0xb0bf180 lockMode=U schedulerid=3 kpid=11392 status=suspended spid=57 sbid=0 ecid=0 priority=0 trancount=2 lastbatchstarted=2014-04-11T00:15:30.953 lastbatchcompleted=2014-04-11T00:15:30.950 lastattention=1900-01-01T00:00:00.950 clientapp=.Net SqlClient Data …Run Code Online (Sandbox Code Playgroud) 如何找出具有精确模式的两个表之间的数据差异,以及如何生成同步 SQL 以获得联合结果(无重复)?
这是2个表:
SOURCE01.dbo.Customers (31,022 rows)
TARGET01.dbo.Customers (29,300 rows)
每个表的架构是:
[CustomerId] : nvarchar(255)[CustomerSerializedProfile]: nvarchar(max)[CreatedDatetime] : DateTime给定以下常量:
给定这些常量,SQL Server 是否总是为给定的查询生成相同的计划?
如果没有,是否还有其他考虑?是否还需要考虑不确定性因素?
我正在接受培训,其中一个脚本具有以下命令:
SELECT SUM(Col2) FROM clust_table WHERE Col1 % 3 = 1
Run Code Online (Sandbox Code Playgroud)
我想知道这个片段在 WHERE 子句中的用途: Col1 % 3 = 1
我在互联网上做了一些研究,没有找到关于这个命令的参考。
我想知道以下两种方法之间的区别是什么:
GETUTCDATE()-2
Run Code Online (Sandbox Code Playgroud)
和
DATEADD(d,-2,GETUTCDATE())
Run Code Online (Sandbox Code Playgroud)
我想使用DATEADD是正确的方法,但想知道为什么?
有时我有一个 SQL 脚本,其中包含一个或多个超长(有时甚至是愚蠢的)字符串。通常这些是VARBINARY代表文件/程序集的文字/常量,但有时它们是文本。
真正长字符串的主要问题是一些文本编辑器不能很好地处理它们。例如,我VARBINARY在CREATE ASSEMBLY [AssemblyName] FROM 0x....语句中使用了一个文字,而程序集本身的大小刚好超过 1 MB,相当于文本文件中的字符超过 200 万个,因为每个字节需要两个字符以十六进制表示法表示(例如0x1F= a1和 an F)。SQL Server Management Studio (SSMS) 不能很好地处理这个问题,并在我尝试滚动该行时挂起几秒钟。事实上,某些版本(不确定这是否仍然发生)甚至会在打开至少有一行超过特定长度的脚本时显示关于长行的警告。
第二个问题是,在没有启用自动换行的编辑器中使用或在线发布时,它会使格式复杂化。这里的问题是水平滚动条的滑块非常窄,即使稍微移动它,通常也会将非超长文本滚动到视野之外。
现在,T-SQL 不会用换行符甚至分号终止命令(尽管从 SQL Server 2005 开始,分号是首选/推荐的)。因此,由于 SQL Server 知道如何解析每个语句,从而知道它何时结束,似乎将长行拆分为多行,仅由newline/ carriage-return+分隔line-feed,这似乎并不合理。但这在任何一种情况下都不起作用。
PRINT 'Line1
Line2';
Run Code Online (Sandbox Code Playgroud)
返回(在“消息”选项卡中):
Line1
Line2
Run Code Online (Sandbox Code Playgroud)
这很有意义,因为换行符在文字/常量内。但是对 a 执行此操作VARBINARY也不起作用。
PRINT 0x1234
5678;
Run Code Online (Sandbox Code Playgroud)
给我一个错误。
不知何故,几十年前,在我们的数据库中创建了一个以#. 它显示在应用程序数据库下的对象资源管理器中,而不是tempdb. 出于某种原因,Azure 不会像这样导入数据库。
我们不能删除它、重命名它或与之交互。我已经尝试过从对象资源管理器中删除、脚本删除、从 GUI 中重命名,但都没有奏效。
我们使用的是 SQL 2008 R2。
drop table [*app*].[dbo]."#OBSOLETE";
Database name '*app*' ignored, referencing object in tempdb.
Msg 3701, Level 11, State 5, Line 1
Cannot drop the table '#OBSOLETE', because it does not exist or you do not
have permission.
exec sp_rename "dbo.#OBSOLETE", "dbo.obsolete"
Msg 15225, Level 11, State 1, Procedure sp_rename, Line 338
No item by the name of 'dbo.#OBSOLETE' could …Run Code Online (Sandbox Code Playgroud)