Sqlserver 中的一些SET参数、系统表的查询

发布时间 2023-12-26 17:34:53作者: 看一百次夜空里的深蓝

SQL:BatchStarting: 是 SQL Server Profiler 中的一个事件,它指示一个新的 SQL 批处理正在开始执行。当 SQL Server 开始执行一个新的批处理时,它会生成此事件。批处理可以包含一个或多个 SQL 语句,它们将作为一个单独的单元执行。在 Profiler 或 Extended Events 中捕获这个事件可以帮助你跟踪和分析 SQL Server 中正在执行的查询或操作。
SQL:BatchCompleted: 是 SQL Server Profiler 中的一个事件。当 SQL Server 完成执行一个 SQL 批处理(Batch)时,会生成这个事件。这个事件的产生意味着整个 SQL 批处理已经执行完毕,并且可以包含一个或多个 SQL 语句。
在 SQL Server Profiler 中,可以使用这个事件来跟踪查询和批处理的执行情况。SQL:BatchCompleted 事件提供了关于查询执行时间、影响的行数、执行计划等信息,对于监视数据库的性能和查询执行情况非常有用。通过分析这个事件,你可以了解到 SQL 语句的执行效率、执行计划以及可能存在的性能瓶颈。


SET NO_BROWSETABLE ON :是 SQL Server 中的一个选项,它用于指示数据库引擎在执行查询时不要返回任何结果集。这个选项通常用于阻止返回结果,只执行对数据的更改或操作。
当你设置 NO_BROWSETABLE 为 ON 时,执行查询将不会返回结果集,即使查询本身会生成结果。这在某些情况下可能是有用的,特别是当你只对修改数据感兴趣,而不是获取结果集时。要记住的是,启用此选项后,你将无法看到由查询生成的结果,因此需谨慎使用,以免导致不必要的数据丢失或错误。

SET FMTONLY ON: 是针对 SQL Server 的一个 T-SQL 语句,用于在执行 Transact-SQL 批处理时,只返回查询的元数据(Metadata)信息,而不返回实际的数据记录。这个语句在某些情况下很有用,特别是在需要检查查询语句生成的结果集的结构,但并不需要实际返回数据的情况下。
当执行 SET FMTONLY ON 后,SQL Server 会模拟执行查询语句,分析其数据的结构,但不会执行实际的查询操作。这样可以快速获取查询的元数据,例如列名、数据类型等信息,而不必等待整个查询执行完毕返回数据。
这个语句的典型使用场景是在开发和调试过程中,当你需要检查一个查询返回的列的数据类型或者结构是否符合预期时。但需要谨慎使用,因为它仅返回空的结果集,并且有时可能会导致误解或错误的结果,特别是当查询依赖于实际的数据来进行一些操作时。

NOLOCK: 是 SQL Server 中用于指定不使用共享锁(Shared Lock)的查询提示。它允许查询在读取数据时不加锁,以提高并发性能。在 SQL 查询中使用 NOLOCK 提示时,查询将不会等待其他事务释放其持有的锁,这可能会导致读取未提交的数据(脏读)或者读取到尚未提交的修改。
使用 NOLOCK 查询提示时需要注意以下几点:
读取未提交的数据:由于不使用锁机制,可能会读取到尚未提交的数据。这意味着查询结果可能包含其他事务尚未提交的修改,可能导致不一致的结果。
可能导致幻读和不可重复读:尽管 NOLOCK 可以提高并发性能,但在并发情况下,可能会导致幻读(Phantom Reads)或不可重复读(Non-repeatable Reads)等问题,因为数据在查询期间可能被其他事务修改。
应用场景:通常在对一致性要求不高,或者对数据最新性要求不严格的场景下才会使用 NOLOCK,比如一些报表查询或数据仅用于参考而不用于重要业务逻辑的情况。

Audit Login: 在 SQL Server 中,你可以使用 SQL Server Audit 来审计登录事件。SQL Server Audit 是一种功能强大的工具,可以跟踪和记录数据库服务器上发生的各种事件,包括登录、查询、更改、删除等操作。

SET QUOTED_IDENTIFIER ON: 是 SQL Server 中的一个语句,用于设置在标识符(如表名、列名、存储过程名等)中使用双引号作为标识符定界符。在使用 QUOTED_IDENTIFIER ON 的情况下,双引号表示标识符,而单引号则用于字符串。
当 QUOTED_IDENTIFIER 设置为 ON 时,SQL Server 将遵循 ANSI SQL 标准,强制要求使用双引号将标识符括起来。

SET ARITHABORT OFF: 用于控制当运算发生错误时,是否引发错误并中止查询。通常情况下,ARITHABORT 默认是启用的(ON)。当它被设置为 OFF 时,一些情况下会改变 SQL Server 引擎的行为。
当 ARITHABORT 设置为 OFF 时,在某些情况下,即使计算出现错误(如除以零),SQL Server 也不会引发错误,而是返回 NULL 或者特定的错误代码。
当 ARITHABORT 设置为 ON 时,默认行为是在发生错误时引发错误并中止查询。这有助于保持数据的完整性,并且可以防止不可预知的行为。
一般来说,默认情况下,最好将 ARITHABORT 设置为 ON,这样可以确保查询的可靠性和一致性。只有在特殊情况下,需要处理不同的错误处理策略或者与其他数据库交互时,才会考虑手动设置 ARITHABORT

SET NUMERIC_ROUNDABORT OFF: 是 SQL Server 中的一个语句,用于控制在发生数据类型转换时是否引发错误。
当 NUMERIC_ROUNDABORT 设置为 OFF 时,如果数据类型转换导致了数据的精度损失(例如,将浮点数转换为整数时会导致小数部分丢失),SQL Server 不会引发错误,而是尝试执行转换并返回结果。这样的话,在一些情况下,即使有精度损失,也不会中止查询或抛出异常。
然而,默认情况下 NUMERIC_ROUNDABORT 是启用的(ON),这意味着当进行数值型数据转换时,如果转换导致了精度丢失,SQL Server 将引发错误并中止查询,以确保数据的完整性和一致性。
通常建议保持 NUMERIC_ROUNDABORT 设置为默认值 ON,这有助于保持数据的准确性和完整性。只有在特殊情况下,需要对精度损失的处理进行不同的设置时,才会考虑手动设置 NUMERIC_ROUNDABORT 为 OFF。

SET ANSI_WARNINGS ON: 用于控制在执行 SQL 查询时是否引发 ANSI 标准警告。
当 ANSI_WARNINGS 设置为 ON 时,SQL Server 将遵循 ANSI 标准,对于一些警告性质的情况(比如截断数据、除零等),会引发警告或者错误,以确保数据的完整性和一致性。
举例来说,在执行某些操作时,如果出现数据截断(将一个值赋给过小的列,导致数据丢失),SQL Server 会引发警告或者错误,中止相关的操作。
默认情况下,ANSI_WARNINGS 是启用的(ON),这有助于保持 SQL 查询的规范性和数据的完整性。只有在某些情况下,你确信了解并且需要忽略某些警告时,才会考虑手动将 ANSI_WARNINGS 设置为 OFF。不过,这种操作需要慎重考虑,因为可能会影响数据的准确性和完整性。

SET ANSI_PADDING ON: 用于控制对于在拼接和比较字符列时的填充方式。
当 ANSI_PADDING 设置为 ON 时,SQL Server 将遵循 ANSI 标准,在使用 CREATE TABLE 或 ALTER TABLE 语句创建或更改表时,使用 ANSI_PADDING 设置为 ON 的情况下,字符列的存储和比较会保留尾部的空格。也就是说,在插入数据时,如果字符串末尾有空格,将会被保留,而不会被截断。
默认情况下,ANSI_PADDING 是启用的(ON),这意味着 SQL Server 将按照 ANSI 标准处理字符列的填充方式。
只有在某些情况下,你确实需要关闭 ANSI 标准的字符列填充行为时,才会考虑手动将 ANSI_PADDING 设置为 OFF。不过,在大多数情况下,最好保持默认设置以确保与 ANSI 标准的兼容性和一致性。

SET ANSI_NULLS ON:用于控制在比较或处理 NULL 值时的行为。
当 ANSI_NULLS 设置为 ON 时,SQL Server 将按照 ANSI 标准处理 NULL 值。在此模式下:
使用等号(=)进行比较时,NULL 不能与任何值相等,包括其他的 NULL。
在聚合函数中,如 COUNT、SUM、AVG 等,将不会包括 NULL 值。
默认情况下,ANSI_NULLS 是启用的(ON),这意味着 SQL Server 将按照 ANSI 标准处理 NULL 值的比较。
只有在某些特殊情况下,你确实需要修改 NULL 值的比较行为时,才会考虑手动将 ANSI_NULLS 设置为 OFF。但是,要谨慎使用,因为修改 ANSI NULL 行为可能导致查询结果与预期不符。

SET CONCAT_NULL_YIELDS_NULL ON: 用于控制在连接字符串时,如果其中有 NULL 值是否返回 NULL。
当 CONCAT_NULL_YIELDS_NULL 设置为 ON 时,在字符串连接时,如果其中一个操作数是 NULL,整个连接表达式的结果将会是 NULL。
默认情况下,CONCAT_NULL_YIELDS_NULL 是启用的(ON)。这意味着如果你试图将一个字符串与 NULL 连接,结果将会是 NULL。

SET IMPLICIT_TRANSACTIONS OFF: 用于控制隐式事务的开启和关闭。
当 IMPLICIT_TRANSACTIONS 设置为 OFF 时,SQL Server 不会自动将每个语句包装在事务中。这意味着每个语句将在自己的事务上下文中执行,并且需要显式地使用 BEGIN TRANSACTION 开启事务,以及使用 COMMIT 或 ROLLBACK 明确地提交或回滚事务。
默认情况下,IMPLICIT_TRANSACTIONS 是禁用的(OFF)。这意味着不会自动开启隐式事务,每个语句都会在自己的事务上下文中执行。
开启隐式事务可能会导致一些意外的结果和行为,因此在大多数情况下,最好保持默认设置,显式地控制事务的开启和关闭,以确保更好地控制事务的边界和行为。

SET LANGUAGE: 是 SQL Server 中的一个语句,用于设置当前会话的语言环境。在 SQL Server 中,它可以影响日期格式、语言相关的错误消息、排序规则等。
SET LANGUAGE 'us_english' 用于将当前会话的语言设置为美国英语。这会影响到在该会话中所执行的一些语言相关的操作,比如日期格式的显示,一些语言相关的错误消息等。
这个语句会将当前会话的语言环境设置为指定的语言,从而影响到会话中执行的一些语言相关的操作和结果显示。

SET DATEFORMAT: 是 SQL Server 中用于设置日期格式的语句,用于指定解释日期字符串的格式。SET DATEFORMAT 'mdy' 会将当前会话的日期格式设置为月/日/年的格式。
在这种设置下,如果你输入一个日期字符串,SQL Server 将按照月/日/年的顺序解释该日期。例如,日期字符串 '01/02/2023' 将被解释为 2023 年 1 月 2 日。
这个设置只影响日期字符串的解释方式,并不影响数据的存储或内部表示。它仅决定了在输入日期时 SQL Server 应该如何解释这些日期。

SET DATEFIRST: 是 SQL Server 中用于设置每周的第一天的语句。默认情况下,SQL Server 将周的第一天设置为 Sunday(7),这与美国常见的习惯一致。
通过 SET DATEFIRST 7 可以显式地将每周的第一天设置为 Sunday(7)。这样,当你执行类似于 DATEPART(WEEKDAY, '2023-12-31') 这样的查询时,它将返回 1,因为 '2023-12-31' 是一周中的第一天,而在 DATEFIRST 设置为默认值 7(Sunday)时,它被认为是一周中的第一天。
这个设置可以影响与日期和周相关的计算,例如,确定一周的开始或者计算日期的周数等。


SET TRANSACTION ISOLATION LEVEL READ COMMITTED: 是 SQL Server 中用于设置事务隔离级别的语句。
READ COMMITTED 是 SQL Server 默认的事务隔离级别。这个级别的含义是:一个事务可以读取到其他已经提交的事务所做的更改,但不能读取到其他事务未提交的更改。它确保了每个事务都只能读取到已提交的数据,并且可以避免脏读(读取到未提交的数据)。
设置事务隔离级别可以在事务开始之前或者在事务内部进行。使用 SET TRANSACTION ISOLATION LEVEL 可以根据需要设置不同的隔离级别,比如 READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ 或 SERIALIZABLE 等。
注意,更高的隔离级别通常会带来更高的数据完整性和一致性,但可能会降低并发性能。因此,在选择事务隔离级别时,需要考虑到系统的要求和性能之间的平衡。

COMMIT TRAN:用于提交事务的命令。当你执行一系列的数据库操作,并希望将这些操作永久地应用到数据库时,你可以使用 COMMIT TRAN 命令来提交事务。
在执行 COMMIT TRAN 后,SQL Server 将会把你在事务中所做的修改永久地保存到数据库中,并释放这个事务所持有的数据库锁。这样其他事务就可以访问这些修改了。
需要注意的是,COMMIT TRAN 只适用于处于已经启动的事务中,它表示你已经完成了这个事务的操作,并且希望将这些操作永久应用到数据库中。

@@TRANCOUNT: 是 SQL Server 中的一个系统函数,用于返回当前会话中活动的事务数量。它返回一个整数值,表示当前事务的嵌套级别。
当执行一个事务时,@@TRANCOUNT 的值会增加。每次执行 BEGIN TRANSACTION 语句,@@TRANCOUNT 的值会增加1。而每次执行 COMMIT TRANSACTION 或 ROLLBACK TRANSACTION,@@TRANCOUNT 的值会减少1。
这个函数对于检查当前会话中是否有未完成的事务或者确定事务的嵌套级别非常有用。当 @@TRANCOUNT 的值为 0 时,表示当前会话中没有活动的事务。

@@SPID 是一个系统函数,用于返回当前会话的进程 ID(SPID)。每个连接到 SQL Server 的会话都有一个唯一的 SPID,它用于标识每个连接的客户端进程。
通过执行 SELECT @@SPID; 可以获取当前会话的 SPID,它是一个数字值,代表当前连接的唯一标识符。这个标识符在处理连接、跟踪和诊断问题时非常有用,特别是在监视和追踪数据库活动时。

 

一些系统表的查询

 1 -- 存储过程查询
 2 EXEC sp_helptext 'Sxxxxer'
 3 SELECT definition FROM sys.sql_modules WHERE object_id = OBJECT_ID('MxxxxY')
 4 -- 表信息查询
 5 SELECT *FROM sys.columns WHERE object_id = OBJECT_ID('Tbl_Cxxxxg');
 6 -- 查询表创建语句
 7 SELECT definition FROM sys.sql_modules WHERE object_id = OBJECT_ID('Sys_User');
 8 -- 查询表备注信息
 9 SELECT obj.name AS TableName, ep.value AS TableComment FROM sys.objects AS obj
10 LEFT JOIN sys.extended_properties AS ep ON ep.major_id = obj.object_id
11 WHERE obj.type_desc = 'USER_TABLE' AND ep.class_desc = 'OBJECT_OR_COLUMN'
12       AND ep.minor_id = 0 AND obj.name = 'Tbl_xxxg';
13 -- 查询表字段与字段备注信息
14 SELECT 
15     cols.name AS ColumnName,
16     ep.value AS ColumnComment
17 FROM 
18     sys.tables AS tbl
19 INNER JOIN 
20     sys.columns AS cols ON tbl.object_id = cols.object_id
21 LEFT JOIN 
22     sys.extended_properties AS ep ON ep.major_id = cols.object_id 
23         AND ep.minor_id = cols.column_id 
24         AND ep.class = 1 -- Class 1 表示对象或列
25         -- AND ep.name = 'MS_Description' -- MS_Description 是存储列注释的属性名
26 WHERE 
27     tbl.name = 'ExxInfo'; -- 替换为你要查询的表名
28 -- 查询视图表字段与字段备注信息
29 SELECT 
30     cols.name AS ColumnName,
31     ep.value AS ColumnComment
32 FROM 
33     sys.views AS vw
34 INNER JOIN 
35     sys.columns AS cols ON vw.object_id = cols.object_id
36 LEFT JOIN 
37     sys.extended_properties AS ep ON ep.major_id = cols.object_id 
38         AND ep.minor_id = cols.column_id 
39         AND ep.class = 1 -- Class 1 表示对象或列
40         --AND ep.name = 'MS_Description' -- MS_Description 是存储列注释的属性名
41 WHERE 
42     vw.name = 'VIEW_ree'; -- 替换为你要查询的视图名