当前位置:  开发笔记 > 编程语言 > 正文

SQL Server的隐藏功能

如何解决《SQLServer的隐藏功能》经验,为你挑选了35个好方法。

SQL Server的一些隐藏功能是什么?

例如,未记录的系统存储过程,做一些非常有用但没有足够文档记录的技巧?


答案

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

存储过程

sp_msforeachtable:使用'?'运行命令 替换为每个表名(v6.5及以上)

sp_msforeachdb:使用'?'运行命令 替换为每个数据库名称(v7及更高版本)

sp_who2:就像sp_who一样,但是有更多关于故障排除块的信息(v7及更高版本)

sp_helptext:如果需要存储过程的代码,请查看&UDF

sp_tables:返回范围内数据库的所有表和视图的列表.

sp_stored_procedures:返回所有存储过程的列表

xp_sscanf:将字符串中的数据读入每个format参数指定的参数位置.

xp_fixeddrives ::找到具有最大可用空间的固定驱动器

sp_help:如果要了解表的结构,索引和约束.还有视图和UDF.快捷键是Alt + F1

片段

以随机顺序返回行

按上次修改日期的所有数据库用户对象

仅限退货日期

查找日期在当前周内某处的记录.

查找上周发生的日期记录.

返回当前周开始的日期.

返回上周开始的日期.

请参阅已部署到服务器的过程的文本

删除与数据库的所有连接

表格校验和

行校验和

删除数据库中的所有过程

还原后正确重新映射登录ID

从INSERT语句调用存储过程

按关键字查找程序

删除数据库中的所有过程

以编程方式查询数据库的事务日志.

功能

HASHBYTES()

EncryptByKey的

PIVOT命令

杂项

连接字符串附加功能

TableDiff.exe

登录事件的触发器(Service Pack 2中的新增功能)

使用持久计算列(pcc)提升性能.

sys.database_principles中的DEFAULT_SCHEMA设置

强制参数化

Vardecimal存储格式

在几秒钟内找出最受欢迎的查询

可扩展的共享数据库

SQL Management Studio中的表/存储过程过滤器功能

跟踪标志

GO重复批次后的数字

使用模式的安全性

使用内置加密函数,视图和带触发器的基表进行加密

GilM.. 91

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

PRINT 'X'
GO 10

将'X'打印10次.这样做可以避免在做重复的事情时从繁琐的复制/粘贴中解脱出来.



1> GilM..:

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

PRINT 'X'
GO 10

将'X'打印10次.这样做可以避免在做重复的事情时从繁琐的复制/粘贴中解脱出来.



2> marc_s..:

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

它可以知道哪些行已插入,更新或删除非常有用,并且输出子句允许这样做很容易-它允许访问称为"虚拟"的表inserteddeleted(如在触发器):

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

如果要将值插入具有INT IDENTITY主键字段的表中,并使用OUTPUT子句,则可以立即获取插入的新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的输出也可以重定向到临时表或表变量(OUTPUT INTO @myInfoTable).

非常有用 - 而且知之甚少!



3> Mitch Wheat..:

sp_msforeachtable:使用'?'运行命令 替换为每个表名.例如

exec sp_msforeachtable "dbcc dbreindex('?')"

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

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

也, sp_MSforeachdb


您可以使用问号周围的单引号获取查询中表的名称.sp_msforeachtable"select count(*),'?' 作为tabenm来自?"

4> Chris Wenham..:

连接字符串附加功能:

MultipleActiveResultSets = TRUE;

这使得ADO.Net 2.0及更高版本在单个数据库连接上读取多个只进,只读结果集,如果您正在进行大量读取,则可以提高性能.即使您正在混合使用各种查询类型,也可以将其打开.

应用程序名称= MyProgramName

现在,当您想通过查询sysprocesses表查看活动连接列表时,程序的名称将显示在program_name列而不是".Net SqlClient Data Provider"中


我在我的公司提出了应用名称的要求.每个新应用都必须具有唯一的名称.跟踪哪个应用程序锁定/破坏了更容易的东西.
应用程序名称也可用作分析器中的过滤器.如果您只想查看查询而不是同事的查询,那么它会有很大帮助.

5> Sklivvz..:

TableDiff.exe

表差异工具允许您发现和协调源表和目标表或视图之间的差异.Tablediff实用程序可以报告架构和数据的差异.tablediff最受欢迎的功能是它可以生成一个脚本,您可以在目标上运行该脚本来协调表之间的差异.

链接



6> Mitch Wheat..:

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

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


非常适合小型结果集.除非你有空闲时间,否则我不会在超过10000行的表上使用它
我甚至看到了100,000,000(100 mil)行的不错结果,没有CHECKSUM().此外,我还要问,为什么不只是按顺序排序?
@GateKiller:我已经回滚你的编辑,因为Checksum()不是一个错误; 它减少了排序列的大小.

7> Thomas..:

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

    在对象资源管理器中,展开给定表下的节点(这样您将看到列,键,约束,触发器等的文件夹)

    指向Columns文件夹并拖入查询.

当您不想使用通过右键单击表并选择Script Table As ...返回时发出的令人发指的格式,这是很方便的,然后插入到...这个技巧可以与其他文件夹一起使用,因为它会给你以逗号分隔的文件夹中包含的名称列表.



8> Rob Boek..:

行构造函数

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

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


是的,这是2008年的新功能.
这是我从DB2到SQL Server时遗漏的一个功能.在DB2中,使用this而不是单个insert语句时,速度有了显着提高

9> Joel Coehoor..:

HashBytes()返回其输入的MD2,MD4,MD5,SHA或SHA1哈希值.



10> Eduardo Molt..:

如果您想了解表结构,索引和约束:

sp_help 'TableName'



11> Sklivvz..:

找出最受欢迎的查询

使用sys.dm_exec_query_stats,您可以通过单个查询找出许多查询分析的组合.

与commnad 链接

select * from sys.dm_exec_query_stats 
order by execution_count desc


你怎么知道命令的语法?

12> Martin Smith..:

空间结果选项卡可用于创建艺术.

在此处输入链接描述http://michaeljswart.com/wp-content/uploads/2010/02/venus.png


我在查询结果中看到了耶稣!
Pfff ......什么笨蛋浪费了他的时间搞乱空间结果选项卡.哦等等......你知道,我认为那篇文章看起来很熟悉,现在我记得为什么.

13> Kolten..:

在为测试目的或其他目的还原数据库时非常有用.正确重新映射登录ID:

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



14> BoltBait..:

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



15> Ray Vega..:

除了和INTERSECT

这两个关键字不是编写复杂的连接和子查询,而是在比较两个查询结果时表达查询意图的更优雅的简写和可读方式.从SQL Server 2005开始,它们强有力地补充了多年来已经存在于TSQL语言中的UNION.

EXCEPT,INTERSECT和UNION的概念是集合论的基础,它是所有现代RDBMS使用的关系建模的基础和基础.现在,使用TSQL可以更直观地生成维恩图类型结果.



16> GateKiller..:

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

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



17> GateKiller..:

表格校验和

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

行校验和

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


这些允许您为表中的所有数据生成校验和.检查两行或两表是否相同是一种简单快捷的方法.

18> 小智..:

我不确定这是否是一个隐藏的功能,但我偶然发现了这一点,并发现它在很多场合都很有用.您可以在单个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,


你也可以使用COALESCE()来做同样的事情而不需要初始化变量.SELECT @nvcConcatonated = COALESCE(@nvcConcatonated +',','')+ CAST(C.CompanyName as VARCHAR(255))FROM ...

19> Eduardo Molt..:

如果您想要存储过程的代码,您可以:

sp_helptext 'ProcedureName'

(不确定它是否是隐藏功能,但我一直使用它)



20> edomaur..:

存储过程技巧是您可以从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



21> Binoj Antony..:

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

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

ORDER BY是强制性条款.OVER()子句告诉SQL引擎对指定列(在本例中为OrderId)中的数据进行排序,并根据排序结果分配数字.



22> Sklivvz..:

用于解析存储过程参数:xp_sscanf

将字符串中的数据读入每个format参数指定的参数位置.

以下示例使用xp_sscanf根据源字符串在源字符串格式中的位置从源字符串中提取两个值.

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


我必须有一个愚蠢的时刻(不,真的).你能告诉我在哪里可以使用它吗?

23> GateKiller..:

仅限退货日期

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

要么

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



24> Nathan Koop..:

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 - 表的最后一行插入行的日期/时间是什么?

在SQL 2005及更高版本中可用



25> Sklivvz..:

以下是我觉得有用的一些功能,但很多人似乎并不了解:

sp_tables

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

链接

sp_stored_procedures

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

链接



26> GateKiller..:

查找日期在当前周内某处的记录.

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

查找上周发生的日期记录.

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

返回当前周开始的日期.

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

返回上周开始的日期.

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



27> 小智..:

不是隐藏功能,而是在Tools\Options\Keyboard下的Management Studio中设置键映射:Alt + F1默认为sp_help"选定文本"但是如果没有为sp_helptext添加Ctrl + F1"选定文本"我就无法生存



28> Sklivvz..:

持续计算的柱

计算列可以帮助您将运行时计算成本转移到数据修改阶段.计算列与行的其余部分一起存储,并在计算列和查询的表达式匹配时透明使用.您还可以在PCC上构建索引,以加快表达式上的过滤和范围扫描.

链接



29> Denis Valeev..:

有时候没有合适的列可以排序,或者您只想在表上使用默认排序顺序,并且您想要枚举每一行.为了做到这一点,你可以在"order by"子句中加上"(select 1)",你就可以得到你想要的东西.干净,嗯?

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



30> John Sheehan..:

使用EncryptByKey进行简单加密



31> 小智..:

/*查找具有最大可用空间的固定驱动器,您还可以复制文件以估计哪个磁盘最快*/

EXEC master..xp_fixeddrives

/*在使用或参考之前检查有关文件的假设*/

EXEC master..xp_fileexist 'C:\file_you_want_to_check'

更多细节在这里



32> NotMe..:

本周我学到的最令人惊讶的事情是在ORDER By Clause中使用CASE语句.例如:

declare @orderby varchar(10)

set @orderby = 'NAME'

select * 
    from Users
    ORDER BY 
        CASE @orderby
            WHEN 'NAME' THEN LastName
            WHEN 'EMAIL' THEN EmailAddress
        END



33> Dan F..:

SQLCMD

如果您已经反复运行脚本,但必须更改细节,那么在sqlcmd模式下运行ssms 非常棒.该SQLCMD命令行是很漂亮了.

我最喜欢的功能是:

你可以设置变量.适当的变量不需要跳过sp_exec箍

您可以一个接一个地运行多个脚本

这些脚本可以引用"外部"脚本中的变量

不再滔滔不绝,Red Gate的Simpletalk做了一个很棒的sqlcmd - SQLCMD Workbench.Donabel Santos也有一些很棒的SQLCMD例子.



34> Ryan Lundy..:

这是一个简单但有用的:

手动编辑表内容时,可以通过键入Control-0 在列中插入NULL.



35> Gordon Bell..:

这是我写的一个查询,按上次修改日期列出所有数据库用户对象:

select name, modify_date, 
case when type_desc = 'USER_TABLE' then 'Table'
when type_desc = 'SQL_STORED_PROCEDURE' then 'Stored Procedure'
when type_desc in ('SQL_INLINE_TABLE_VALUED_FUNCTION', 'SQL_SCALAR_FUNCTION', 'SQL_TABLE_VALUED_FUNCTION') then 'Function'
end as type_desc
from sys.objects
where type in ('U', 'P', 'FN', 'IF', 'TF')
and is_ms_shipped = 0
order by 2 desc

推荐阅读
U友50081205_653
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有