标签: t-sql

SQL Server DATEDIFF:dayofyear 与 day 有何不同?

当我查看SQL Server 上的DATEDIFF()函数时,我发现它采用datepart作为其第一个参数。

可能的日期部分值包括daydayofyear

据我了解,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() 而言,dayofyearday是否等效?

sql-server t-sql

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

sys.dm_exec_requests 中的 request_id 是什么以及它如何变化?

根据MSDN,request_idsys.dm_exec_requests

“请求的 ID。在会话上下文中是唯一的。不可为空。”

从随意观察来看,它总是显示为 0。

有人能告诉我,对于给定的会话,这个 id 怎样才能大于 0?是否可以用一些sql来重现这个?

谢谢!

sql-server t-sql dmv

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

是否可以在 SSMS 中单步执行使用变量的 TSQL?

如果我在 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 了解先前语句(声明变量并赋值)的效果应该延续到下一步?(同样,即使包装在事务中,这种变量的持久性也会失败 - 即使数据更新的持久性取决于事务解析 - 提交或回滚)。

sql-server ssms t-sql transaction

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

即使检查列名是否存在,列名也无效,因此应该跳过查询部分

我有以下查询:

    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)

sql-server query t-sql

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

是否可以使用 sp_WhoIsActive 查看阻止者的主机名或计算机名?

我正在使用 sp_WhoIsActive。

当服务器发生阻塞时,我想快速确定谁是罪魁祸首。

专栏login_name没有给我太多关于拦截器的信息,因为有数百人使用公司的应用程序并在相同的下登录login_name

我可以看到blocking_session_id,但这并没有告诉我阻止者的host_name.

还有一个专栏host_name,但这是一个waiter(不是阻止者)

那么有什么方法可以快速找到该用户host_namemachine name任何其他身份的用户是谁呢blocker

sql-server t-sql sp-whoisactive

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

SQL Server 如何处理 DELETE WHERE EXISTS (SELECT 1 FROM TABLE)?

下面是一个有效的 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 如何知道要删除哪些行?

sql-server delete t-sql exists

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

Azure SQL 数据库抛出错误 1132“弹性池已达到其存储限制”错误,即使它未满

我正在尝试在弹性池内的 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)

sql-server t-sql azure-sql-database

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

Azure SQL 数据库弹性池 - 用于获取当前弹性池的 TSQL

我希望能够使用 TSQL 获取当前数据库所属的弹性池的名称,但我可以找到包含弹性列的唯一 DMV 是 sys.elastic_pool_resource_stats & 我在那里没有看到任何对数据库的引用。我还检查了 sys.databases,看看是否有一个额外的列被偷偷地藏在那里,但我什么也认不出来。

理想情况下,这应该像 @@servername 或 db_name() 一样工作(他们到底什么时候才能创建 server_name() 或 @@dbname 以便我们可以一致地编码?)

有谁知道合适的命令?

(顺便说一句,没有“弹性池”标签)

t-sql azure-sql-database

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

.bacpak 文件中的 .BCP 文件是什么?

在 dba.stackexchange.com 上潜水我找到了一个很好的答案,教我如何.bacpac使用文件资源管理器打开文件。

我用数据库试了一下,AdventureWorks2008R2我所做的就是:

  1. 将数据库保存为.bacpac文件
  2. 将文件扩展名重命名为 .zip
  3. 解压

好了,您可以将数据库的表作为文件夹查看,并且在每个文件夹中您可以查看原始数据。

在此处输入图片说明

但是当我打开文件夹时,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)

sql-server t-sql bacpac

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

存储过程中的局部变量

我在网上读到,如果您在存储过程中使用局部变量而不是输入变量,那么存储过程就会被优化,就像使用提示“OPTIMIZE FOR UNKNOWN”一样。这到底是怎么发生的?另外,一般来说,什么是好的做法:直接使用输入变量还是创建局部变量并将输入变量分配给它们?

sql-server stored-procedures t-sql

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