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子句可以很容易地做到这一点非常有用 – 它允许访问被称为inserted
和deleted
(如在触发器中)的“虚拟”表:
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中,您可以通过以下方式快速获取表格的逗号分隔列表:
- 在对象资源pipe理器中,展开给定表下的节点(以便您将看到列,键,约束,触发器等的文件夹)
- 指向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