SQL Server的隐藏function

SQL Server的一些隐藏function是什么?

例如,没有logging的系统存储过程,窍门做的事情是非常有用的,但没有足够的文件logging?


答案

感谢大家的所有伟大的答案!

存储过程

  • sp_msforeachtable:用'?'运行命令 换成每个表名(v6.5及以上)
  • sp_msforeachdb:用'?'运行命令 replace为每个数据库名称(V7及以上)
  • sp_who2:就像sp_who,但有更多的信息来解决块(v7及以上)
  • sp_helptext:如果您想要存储过程的代码,请查看&UDF
  • sp_tables:返回范围内数据库的所有表和视图的列表。
  • sp_stored_procedures:返回所有存储过程的列表
  • xp_sscanf:将string中的数据读入由每个格式参数指定的参数位置。
  • xp_fixeddrives:查找具有最大可用空间的固定驱动器
  • sp_help:如果你想知道表的结构,索引和约束。 也意见和UDFs。 快捷键是Alt + F1

片段

  • 以随机顺序返回行
  • 所有数据库用户对象按上次修改date
  • 仅返回date
  • 查找哪些date落在当前周内某处的logging。
  • 查找logging上周发生的date。
  • 返回当前星期开始的date。
  • 返回上周开始的date。
  • 请参阅已部署到服务器的过程的文本
  • 删除到数据库的所有连接
  • 表格校验和
  • 行校验和
  • 删除数据库中的所有程序
  • 恢复后重新映射loginID
  • 从INSERT语句调用存储过程
  • 通过关键字查找过程
  • 删除数据库中的所有程序
  • 以编程方式查询数据库的事务日志。

function

  • HASHBYTES()
  • EncryptByKey的
  • PIVOT命令

杂项

  • 连接string额外
  • TableDiff.exe
  • login事件触发器(Service Pack 2中的新增function)
  • 用持久计算列(pcc)提高性能。
  • sys.database_principles中的DEFAULT_SCHEMA设置
  • 强制参数化
  • Vardecimal存储格式
  • 在几秒钟内找出最受欢迎的查询
  • 可扩展的共享数据库
  • SQL Management Studio中的表/存储过程filterfunction
  • 跟踪标志
  • GO之后的编号重复批次
  • 使用模式的安全性
  • encryption使用内置encryptionfunction,视图和基本表与触发器

在Management Studio中,您可以在GO结束标记之后放置一个数字,以使该批次重复该次数:

 PRINT 'X' GO 10 

将打印“X”10次。 这可以节省您从重复的东西时,繁琐的复制/粘贴。

许多SQL Server开发人员似乎还不了解DELETE,INSERT和UPDATE语句上的OUTPUT子句 (SQL Server 2005和更新版本)。

知道哪些行被INSERT,UPDATE或DELETEd,以及OUTPUT子句可以很容易地做到这一点非常有用 – 它允许访问被称为inserteddeleted (如在触发器中)的“虚拟”表:

 DELETE FROM (table) OUTPUT deleted.ID, deleted.Description WHERE (condition) 

如果要使用OUTPUT子句将值插入到具有INT IDENTITY主键字段的表中,则可以立即获取插入的新ID:

 INSERT INTO MyTable(Field1, Field2) OUTPUT inserted.ID VALUES (Value1, Value2) 

如果你正在更新,那么知道改变了什么是非常有用的 – 在这种情况下, inserted表示新值(在UPDATE之后),而deleted是指UPDATE之前的旧值:

 UPDATE (table) SET field1 = value1, field2 = value2 OUTPUT inserted.ID, deleted.field1, inserted.field1 WHERE (condition) 

如果大量的信息被返回,OUTPUT的输出也可以被redirect到一个临时表或一个表variables( OUTPUT INTO @myInfoTable )。

非常有用 – 而且知之甚less!

渣子

sp_msforeachtable :用'?'运行命令 换成每个表名。 例如

 exec sp_msforeachtable "dbcc dbreindex('?')" 

每个表最多可以发出3个命令

 exec sp_msforeachtable @Command1 = 'print ''reindexing table ?''', @Command2 = 'dbcc dbreindex(''?'')', @Command3 = 'select count (*) [?] from ?' 

另外, sp_MSforeachdb

连接string额外:

MultipleActiveResultSets = TRUE;

这使得ADO.Net 2.0及更高版本可以在单个数据库连接上读取多个仅向前的只读结果集,如果您正在进行大量阅读,这可以提高性能。 即使您正在混合查询types,也可以将其打开。

应用程序名称= MyProgramName

现在当你想通过查询sysprocesses表来查看活动连接列表时,你的程序名将出现在program_name列而不是“.Net SqlClient Data Provider”

TableDiff.exe

  • 表差异工具允许您发现和协调源表和目标表或视图之间的差异。 Tablediff实用程序可以报告架构和数据的差异。 tablediff最stream行的特性是,它可以生成一个脚本,可以在目标上运行,以调和表之间的差异。

链接

一种较less人知道的TSQL技术,用于以随机顺序返回行:

 -- Return rows in a random order SELECT SomeColumn FROM SomeTable ORDER BY CHECKSUM(NEWID()) 

在Management Studio中,您可以通过以下方式快速获取表格的逗号分隔列表:

  1. 在对象资源pipe理器中,展开给定表下的节点(以便您将看到列,键,约束,触发器等的文件夹)
  2. 指向Columns文件夹并拖入查询。

当你不想使用右键单击表格并selectScript Table As …,然后selectInsert To …时,这种方法非常方便。这个技巧与其他文件夹一起工作,它会给你文件夹中包含的名称的逗号分隔列表。

行构造函数

您可以使用单个插入语句插入多行数据。

 INSERT INTO Colors (id, Color) VALUES (1, 'Red'), (2, 'Blue'), (3, 'Green'), (4, 'Yellow') 

如果你想知道表结构,索引和约束:

 sp_help 'TableName' 

HashBytes()返回其input的MD2,MD4,MD5,SHA或SHA1哈希。

找出最受欢迎的查询

  • 使用sys.dm_exec_query_stats,您可以通过单个查询来计算出查询分析的许多组合。

与commnad 链接

 select * from sys.dm_exec_query_stats order by execution_count desc 

空间结果标签可用于创build艺术 。

在这里input链接描述wp-content/uploads/2010/02/venus.png

除了和INTERSECT

在比较两个查询结果时,这两个关键字不是编写精心devise的联接和子查询,而是expression查询意图的更为优雅的简洁和可读的方式。 作为SQL Server 2005的新增function,它们强大地补充了已经存在于TSQL语言中的UNION多年。

除了INTERSECT和UNION之外,集合论的基础是所有现代RDBMS所使用的关系build模的基础和基础。 现在,使用TSQL可以更直观,更容易地生成维恩图types的结果。

我知道这不是完全隐藏的,但是没有太多人知道PIVOT命令。 我能够改变一个使用游标的存储过程,并花了2分钟跑到一个快速的6秒的代码行数的十分之一!

恢复数据库用于testing目的或其他方面很有用。 重新映射loginID的正确:

 EXEC sp_change_users_login 'Auto_Fix', 'Mary', NULL, 'B3r12-36' 

删除到数据库的所有连接:

 Use Master Go Declare @dbname sysname Set @dbname = 'name of database you want to drop connections from' Declare @spid int Select @spid = min(spid) from master.dbo.sysprocesses where dbid = db_id(@dbname) While @spid Is Not Null Begin Execute ('Kill ' + @spid) Select @spid = min(spid) from master.dbo.sysprocesses where dbid = db_id(@dbname) and spid > @spid End 

表格校验和

 Select CheckSum_Agg(Binary_CheckSum(*)) From Table With (NOLOCK) 

行校验和

 Select CheckSum_Agg(Binary_CheckSum(*)) From Table With (NOLOCK) Where Column = Value 

我不确定这是不是一个隐藏的function,但我偶然发现,并发现它在许多场合都很有用。 您可以在单个select语句中concatonate一组字段,而不是使用游标并遍历select语句。

例:

 DECLARE @nvcConcatonated nvarchar(max) SET @nvcConcatonated = '' SELECT @nvcConcatonated = @nvcConcatonated + C.CompanyName + ', ' FROM tblCompany C WHERE C.CompanyID IN (1,2,3) SELECT @nvcConcatonated 

结果:

 Acme, Microsoft, Apple, 

如果你想要一个存储过程的代码,你可以:

 sp_helptext 'ProcedureName' 

(不知道是否隐藏function,但我一直使用它)

存储过程技巧是你可以从INSERT语句中调用它们。 当我在SQL Server数据库上工作时,我发现这非常有用。

 CREATE TABLE #toto (v1 int, v2 int, v3 char(4), status char(6)) INSERT #toto (v1, v2, v3, status) EXEC dbo.sp_fulubulu(sp_param1) SELECT * FROM #toto DROP TABLE #toto 

在SQL Server 2005/2008中显示SELECT查询结果中的行号:

 SELECT ( ROW_NUMBER() OVER (ORDER BY OrderId) ) AS RowNumber, GrandTotal, CustomerId, PurchaseDate FROM Orders 

ORDER BY是一个强制性条款。 OVER()子句通知SQL引擎对指定列(本例中为OrderId)上的数据进行sorting,并根据sorting结果分配数字。

用于parsing存储过程参数: xp_sscanf

将string中的数据读入由每个格式参数指定的参数位置。

以下示例使用xp_sscanf根据源string格式中的位置提取源string中的两个值。

 DECLARE @filename varchar (20), @message varchar (20) EXEC xp_sscanf 'sync -b -fproducts10.tmp -rrandom', 'sync -b -f%s -r%s', @filename OUTPUT, @message OUTPUT SELECT @filename, @message 

这是结果集。

 -------------------- -------------------- products10.tmp random 

仅返回date

 Select Cast(Floor(Cast(Getdate() As Float))As Datetime) 

要么

 Select DateAdd(Day, 0, DateDiff(Day, 0, Getdate())) 

dm_db_index_usage_stats

这允许您知道表中的数据是否最近已经更新,即使您在表上没有DateUpdated列也是如此。

 SELECT OBJECT_NAME(OBJECT_ID) AS DatabaseName, last_user_update,* FROM sys.dm_db_index_usage_stats WHERE database_id = DB_ID( 'MyDatabase') AND OBJECT_ID=OBJECT_ID('MyTable') 

代码来自: http : //blog.sqlauthority.com/2009/05/09/sql-server-find-last-date-time-updated-for-any-table/

引用的信息: SQL Server – 表的最后插入行的date/时间是什么?

在SQL 2005和更高版本中可用

以下是我发现有用的一些function,但很多人似乎都不知道:

 sp_tables 

返回当前环境中可以查询的对象列表。 这意味着可以出现在FROM子句中的任何对象,除了同义词对象。

链接

 sp_stored_procedures 

返回当前环境中的存储过程列表。

链接

查找哪些date落在当前周内某处的logging。

 where dateadd( week, datediff( week, 0, TransDate ), 0 ) = dateadd( week, datediff( week, 0, getdate() ), 0 ) 

查找logging上周发生的date。

 where dateadd( week, datediff( week, 0, TransDate ), 0 ) = dateadd( week, datediff( week, 0, getdate() ) - 1, 0 ) 

返回当前星期开始的date。

 select dateadd( week, datediff( week, 0, getdate() ), 0 ) 

返回上周开始的date。

 select dateadd( week, datediff( week, 0, getdate() ) - 1, 0 ) 

不是一个隐藏的function,但在工具\选项\键盘下在Management Studio中设置键映射:Alt + F1默认为sp_help“选定的文本”,但我不能没有为sp_helptext添加Ctrl + F1“选定的文本”

持续计算的柱

  • 计算列可帮助您将运行时计算成本转换为数据修改阶段。 计算列与行的其余部分一起存储,并在计算列和查询上的expression式匹配时透明地使用。 您也可以在PCC上build立索引,以加快对expression式的过滤和范围扫描。

链接

有些时候,没有合适的列进行sorting,或者只是希望在表上使用默认的sorting顺序,并且想要枚举每一行。 为了做到这一点,你可以把“(select 1)”放在“order by”子句中,你会得到你想要的。 整洁,呃?

 select row_number() over (order by (select 1)), * from dbo.Table as t 

使用EncryptByKey进行简单的encryption