标签: sql-server

datetime 和 datetime2 的比较不正确

我知道隐式类型转换不是一个好习惯。但当较低的值突然变得较高时,这确实是意想不到的行为。

declare @LastSelectedDate DATETIME = '2021-11-09 13:52:29.187'
declare @LastSelectedDate_1 DATETIME2(7) = '2021-11-09 13:52:29.1866667'


SELECT IIF(@LastSelectedDate_1 > CAST(@LastSelectedDate AS DATETIME2), 1, 0)
SELECT IIF(@LastSelectedDate_1 > @LastSelectedDate, 1, 0)
Run Code Online (Sandbox Code Playgroud)

这是一个错误还是我遗漏了什么?我正在使用 SQL Server 2016。

sql-server datetime datetime2 sql-server-2016

15
推荐指数
1
解决办法
2469
查看次数

正在恢复数据库“MyDb”。等待恢复完成

我得到了这样的错误:

正在恢复数据库“MyDb”。等待恢复完成。

那时我做了一个危急的手术。

造成这种情况的原因是什么?以及如何避免?

sql-server sql-server-2008-r2 recovery

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

我如何找出*为什么*用户具有某些有效权限?

我知道我可以使用sys.fn_my_permissions以下方法查询有效权限:

USE myDatabase;
SELECT * FROM fn_my_permissions('dbo.myTable', 'OBJECT') 

 entity_name | subentity_name | permission_name 
------------------------------------------------
 dbo.myTable |                | SELECT          
 dbo.myTable |                | UPDATE          
 ...
Run Code Online (Sandbox Code Playgroud)

这告诉我当前用户myTable在数据库中是否具有 SELECT、INSERT、UPDATE 等权限myDatabase

是否可以很容易地找出为什么用户拥有这些权限?例如,我希望有一个fn_my_permissions_ex输出附加reason列的函数:

USE myDatabase;
SELECT * FROM fn_my_permissions_ex('dbo.myTable', 'OBJECT') 

 entity_name | subentity_name | permission_name | reason
------------------------------------------------------------------------------------------------------------------------------------
 dbo.myTable |                | SELECT          | granted to database role public
 dbo.myTable |                | UPDATE          | member of group MYDOMAIN\Superusers, which belongs to database role db_datawriter
 ... …
Run Code Online (Sandbox Code Playgroud)

security sql-server permissions debugging

14
推荐指数
1
解决办法
4403
查看次数

是否可以使用 SSMS 建立专用管理员连接 (DAC)?

是否可以使用 SSMS 连接到 DAC?如果我理解正确,应该可以在服务器名称前使用“admin:”前缀,但我收到以下消息:

SSMS 不支持专用管理员连接,因为它按照设计建立了多个连接。(Microsoft.SqlServer.Management.SqlStudio.Explorer)

sql-server sql-server-2012 dac

14
推荐指数
2
解决办法
9735
查看次数

查找孤立用户

在 SQL Server 2005 中,有没有办法找到在服务器级别不存在的用户(在服务器级别删除但在删除之前未与数据库解除关联的帐户)或未链接的帐户(帐户可能已在服务器级别而不是数据库级别被删除,然后重新读取但数据库级别从未被清理过)。

我有一个非常凌乱的服务器,如果可以运行查询来找到这些,那就太棒了。

sql-server-2005 sql-server users

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

如何从 SQL Server 数据库导出所有与安全相关的信息

你们可能知道,SQL Server 没有提供开箱即用的解决方案来导出为数据库中的每个元素声明的所有安全相关语句(在数据库级别和对象级别)

我说的是提供这些信息的能力

  • 所有用户
  • 所有用户定义的角色
  • 数据库级别的所有权限(例如 GRANT CREATE FUNCTION)
  • 对象级别的所有权限(例如 GRANT SELECT ON OBJECT::xxx)

您可能会认为 SQL Server 必须有类似的东西,但 SQL Server 导出向导或因右键单击对象而生成的各种脚本都不会捕获此信息。

我在网上看到许多不同的“可能的解决方案”使用人们慷慨发布的非策划脚本,但由于我必须 100% 确定所有安全信息都被捕获,因此我不能完全依赖这些脚本。

我可以选择使用这些作为自己编写一些东西的起点,但我讨厌必须重新发明轮子来满足您认为很多人可能有的要求。

是否有人提供的工具(作为 SQL Server 产品的一部分或第三方工具)可以可靠地为您提供此信息?

或者至少,是否有大多数人会同意“将完成这项工作”的社区支持脚本?

谢谢!

security sql-server export

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

如何在SQL中获取使用用户名执行的查询历史记录

我可以使用以下方法执行查询:

SELECT deqs.last_execution_time AS [Time]
    ,dest.TEXT AS [Query]
FROM sys.dm_exec_query_stats AS deqs
CROSS APPLY sys.dm_exec_sql_text(deqs.sql_handle) AS dest
ORDER BY deqs.last_execution_time DESC
Run Code Online (Sandbox Code Playgroud)

但我也在寻找username执行这些查询的列。

sql-server-2008 sql-server audit

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

为什么临时表比急切线轴更有效地解决万圣节问题?

考虑以下查询,该查询仅在源表中不存在时才插入源表中的行:

INSERT INTO dbo.HALLOWEEN_IS_COMING_EARLY_THIS_YEAR WITH (TABLOCK)
SELECT maybe_new_rows.ID
FROM dbo.A_HEAP_OF_MOSTLY_NEW_ROWS maybe_new_rows
WHERE NOT EXISTS (
    SELECT 1
    FROM dbo.HALLOWEEN_IS_COMING_EARLY_THIS_YEAR halloween
    WHERE maybe_new_rows.ID = halloween.ID
)
OPTION (MAXDOP 1, QUERYTRACEON 7470);
Run Code Online (Sandbox Code Playgroud)

一种可能的计划形状包括合并连接和急切线轴。Eager spool 运算符用于解决万圣节问题

第一个计划

在我的机器上,上面的代码在大约 6900 毫秒内执行。用于创建表格的重现代码包含在问题的底部。如果我对性能不满意,我可能会尝试加载要插入到临时表中的行,而不是依赖于 Eager spool。这是一种可能的实现:

DROP TABLE IF EXISTS #CONSULTANT_RECOMMENDED_TEMP_TABLE;
CREATE TABLE #CONSULTANT_RECOMMENDED_TEMP_TABLE (
    ID BIGINT,
    PRIMARY KEY (ID)
);

INSERT INTO #CONSULTANT_RECOMMENDED_TEMP_TABLE WITH (TABLOCK)
SELECT maybe_new_rows.ID
FROM dbo.A_HEAP_OF_MOSTLY_NEW_ROWS maybe_new_rows
WHERE NOT EXISTS (
    SELECT 1
    FROM dbo.HALLOWEEN_IS_COMING_EARLY_THIS_YEAR halloween
    WHERE maybe_new_rows.ID = halloween.ID
)
OPTION …
Run Code Online (Sandbox Code Playgroud)

sql-server database-internals sql-server-2017

14
推荐指数
2
解决办法
1593
查看次数

如何在大表的有序列中获取最后一个非空值?

我有以下输入:

 id | value 
----+-------
  1 |   136
  2 |  NULL
  3 |   650
  4 |  NULL
  5 |  NULL
  6 |  NULL
  7 |   954
  8 |  NULL
  9 |   104
 10 |  NULL
Run Code Online (Sandbox Code Playgroud)

我希望得到以下结果:

 id | value 
----+-------
  1 |   136
  2 |   136
  3 |   650
  4 |   650
  5 |   650
  6 |   650
  7 |   954
  8 |   954
  9 |   104
 10 |   104
Run Code Online (Sandbox Code Playgroud)

简单的解决方案是用<关系连接表,然后选择 a 中的MAXGROUP BY: …

null sql-server t-sql window-functions running-totals

14
推荐指数
3
解决办法
7268
查看次数

如果索引中包含 VARCHAR(MAX) 列,是否始终将整个值存储在索引页中?

我是出于好奇而问这个问题的,受到这个问题的启发。

我们知道VARCHAR(MAX)值超过8000个字节并不存储在行,但在不同的LOB页。随后检索具有此类值的行需要两个或多个逻辑 IO 操作(实际上,理论上需要多一个)。

我们可以将一VARCHAR(MAX)列作为INCLUDEd添加到唯一索引,如链接问题所示。如果此列的值长度超过 8000 字节,这些值是否仍会“内联”存储在索引叶页中,还是也将移动到 LOB 页?

sql-server varchar

14
推荐指数
1
解决办法
3545
查看次数