当我查看SQL Server 上的DATEDIFF()函数时,我发现它采用datepart作为其第一个参数。
可能的日期部分值包括day和dayofyear。
据我了解,dayofyear是一年中的第几天(例如,2 月 2 日是 33),day是该月的第几天(因此 2 月 2 日是 2)。但是,我不明白 DATEDIFF 函数的区别。
这里有些例子:
select DATEDIFF(dayofyear, '2012-01-01', '2012-02-02')
returns: 32
select DATEDIFF(day, '2012-01-01', '2012-02-02')
returns: 32
select DATEDIFF(dayofyear, '2011-02-01', '2012-02-02')
returns: 366
select DATEDIFF(day, '2011-02-01', '2012-02-02')
returns 366
Run Code Online (Sandbox Code Playgroud)
对于 DATEDIFF() 而言,dayofyear和day是否等效?
根据MSDN,request_idsys.dm_exec_requests是
“请求的 ID。在会话上下文中是唯一的。不可为空。”
从随意观察来看,它总是显示为 0。
有人能告诉我,对于给定的会话,这个 id 怎样才能大于 0?是否可以用一些sql来重现这个?
谢谢!
如果我在 SSMS 查询编辑器中输入 TSQL,我知道我可以通过突出显示一条语句并按键盘上的 F5 来“单步执行”这些语句(即一次执行一个语句)。
但默认情况下,该会话似乎没有打开的事务。每次执行都已提交。
我可以编写 TSQL,使其以or开头BEGIN TRAN和结尾- 这确保了当我逐步执行时,我可以选择退出更改。COMMITROLLBACK
然而,我遇到的问题是当我声明变量时。考虑:
declare @flag bit = 0;
select case when @flag = 0 then 'off' when @flag = 1 then 'on' end as FlagCheck;
Run Code Online (Sandbox Code Playgroud)
无论上面的内容是否包含在事务中,如果我单独运行第一个语句,然后单独运行下一个语句,则第二个语句将失败,因为尚未声明变量。
是否可以单步执行这样的代码,并让 SSMS 了解先前语句(声明变量并赋值)的效果应该延续到下一步?(同样,即使包装在事务中,这种变量的持久性也会失败 - 即使数据更新的持久性取决于事务解析 - 提交或回滚)。
我有以下查询:
IF EXISTS( SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'NotificationTableLogRows' AND COLUMN_NAME = 'DestinationAddress') BEGIN
UPDATE NotificationTableLogRows
SET [HandlerID] = m.ID
FROM [Unicare].dbo.MobileDevices m
WHERE HandlerID is null
AND m.CallNumber = NotificationTableLogRows.DestinationAddress AND NotificationTableLogRows.HandlerTypeID = 2
END
print 'end'
Run Code Online (Sandbox Code Playgroud)
但运行后,我仍然收到错误:
Msg 207, Level 16, State 1, Line 6
Invalid column name 'DestinationAddress'.
Run Code Online (Sandbox Code Playgroud)
但是它应该只打印结束
我究竟做错了什么?
编辑:
即使:
IF 1 = 0 BEGIN
UPDATE NotificationTableLogRows
SET [HandlerID] = m.ID
FROM [Unicare].dbo.MobileDevices m
WHERE HandlerID is null
AND m.CallNumber = NotificationTableLogRows.DestinationAddress …Run Code Online (Sandbox Code Playgroud) 我正在使用 sp_WhoIsActive。
当服务器发生阻塞时,我想快速确定谁是罪魁祸首。
专栏login_name没有给我太多关于拦截器的信息,因为有数百人使用公司的应用程序并在相同的下登录login_name。
我可以看到blocking_session_id,但这并没有告诉我阻止者的host_name.
还有一个专栏host_name,但这是一个waiter(不是阻止者)
那么有什么方法可以快速找到该用户host_name或machine name任何其他身份的用户是谁呢blocker?
下面是一个有效的 TSQL 语句。但我想了解 SQL Server 如何处理它。
DELETE A
FROM table1 WITH (NOLOCK)
WHERE
EXISTS
(
SELECT 1
FROM
table2 B WITH (NOLOCK)
WHERE
B.id = A.id
)
Run Code Online (Sandbox Code Playgroud)
因为子查询的输出将是一个 1 的列表。SQL Server 如何知道要删除哪些行?
我正在尝试在弹性池内的 Azure SQL 数据库中执行以下(示例)批处理:
drop table if exists [dbo].[InsertTest];
create table [dbo].[InsertTest] (
[id] uniqueidentifier,
[filler] nvarchar(max)
);
insert into [dbo].[InsertTest] ([id], [filler])
select top 1000 newid(), replicate('X', 2048)
from [sys].[objects] as [T1]
cross join [sys].[objects] as [T2];
/* drop table if exists [dbo].[InsertTest]; */
Run Code Online (Sandbox Code Playgroud)
但该insert语句失败并显示错误消息:
Msg 1132, Level 16, State 1, Line 1
The elastic pool has reached its storage limit. The storage used for the elastic pool cannot exceed (51200) MBs.
Run Code Online (Sandbox Code Playgroud)
我试图通过运行查询来查看空间是否不足
select
[type_desc] as [file_type], …Run Code Online (Sandbox Code Playgroud) 我希望能够使用 TSQL 获取当前数据库所属的弹性池的名称,但我可以找到包含弹性列的唯一 DMV 是 sys.elastic_pool_resource_stats & 我在那里没有看到任何对数据库的引用。我还检查了 sys.databases,看看是否有一个额外的列被偷偷地藏在那里,但我什么也认不出来。
理想情况下,这应该像 @@servername 或 db_name() 一样工作(他们到底什么时候才能创建 server_name() 或 @@dbname 以便我们可以一致地编码?)
有谁知道合适的命令?
(顺便说一句,没有“弹性池”标签)
在 dba.stackexchange.com 上潜水我找到了一个很好的答案,教我如何.bacpac使用文件资源管理器打开文件。
我用数据库试了一下,AdventureWorks2008R2我所做的就是:
.bacpac文件.zip好了,您可以将数据库的表作为文件夹查看,并且在每个文件夹中您可以查看原始数据。
但是当我打开文件夹时,Person.Address我看到里面有 38 个扩展名为.BCP.
一开始我教他们是数据被分割的页面。但那些不能是页面,因为它们的重量约为67KB. 页面应该权重8KB。
所以我用这个查询检查了页数:
-- Total # of pages, used_pages, and data_pages for a given heap/clustered index
SELECT
t.NAME AS TableName,
p.rows AS RowCounts,
SUM(a.total_pages) AS TotalPages,
SUM(a.used_pages) AS UsedPages,
(SUM(a.total_pages) - SUM(a.used_pages)) AS UnusedPages
FROM
sys.tables t
INNER JOIN
sys.indexes i ON t.OBJECT_ID = i.object_id
INNER JOIN
sys.partitions p ON i.object_id = …Run Code Online (Sandbox Code Playgroud) 我在网上读到,如果您在存储过程中使用局部变量而不是输入变量,那么存储过程就会被优化,就像使用提示“OPTIMIZE FOR UNKNOWN”一样。这到底是怎么发生的?另外,一般来说,什么是好的做法:直接使用输入变量还是创建局部变量并将输入变量分配给它们?