SQL Server有哪些隐藏特性?

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


答案

感谢大家的精彩回答!

存储过程

sp_msforeachtable: Runs a command with '?' replaced with each table name (v6.5 and up) sp_msforeachdb: Runs a command with '?' replaced with each database name (v7 and up) sp_who2: just like sp_who, but with a lot more info for troubleshooting blocks (v7 and up) sp_helptext: If you want the code of a stored procedure, view & UDF sp_tables: return a list of all tables and views of database in scope. sp_stored_procedures: return a list of all stored procedures xp_sscanf: Reads data from the string into the argument locations specified by each format argument. xp_fixeddrives:: Find the fixed drive with largest free space sp_help: If you want to know the table structure, indexes and constraints of a table. Also views and UDFs. Shortcut is Alt+F1

片段

Returning rows in random order All database User Objects by Last Modified Date Return Date Only Find records which date falls somewhere inside the current week. Find records which date occurred last week. Returns the date for the beginning of the current week. Returns the date for the beginning of last week. See the text of a procedure that has been deployed to a server Drop all connections to the database Table Checksum Row Checksum Drop all the procedures in a database Re-map the login Ids correctly after restore Call Stored Procedures from an INSERT statement Find Procedures By Keyword Drop all the procedures in a database Query the transaction log for a database programmatically.

功能

哈希字节() EncryptByKey 枢轴命令

Misc

Connection String extras TableDiff.exe Triggers for Logon Events (New in Service Pack 2) Boosting performance with persisted-computed-columns (pcc). DEFAULT_SCHEMA setting in sys.database_principles Forced Parameterization Vardecimal Storage Format Figuring out the most popular queries in seconds Scalable Shared Databases Table/Stored Procedure Filter feature in SQL Management Studio Trace flags Number after a GO repeats the batch Security using schemas Encryption using built in encryption functions, views and base tables with triggers


以下是一些我认为有用但很多人似乎不知道的功能:

sp_tables

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

Link

sp_stored_procedures

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

Link


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


使用EncryptByKey进行简单加密


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

将数据从字符串读入每个格式参数指定的参数位置。 下面的示例使用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

Sp_who2,就像sp_who一样,但是有更多关于故障排除块的信息


/*找到空闲空间最大的固定驱动器,也可以复制文件来估计哪个磁盘最快*/

EXEC master..xp_fixeddrives

/*在使用或引用之前检查文件的假设*/

EXEC master..xp_fileexist 'C:\file_you_want_to_check'

详情请点击这里


sp_msforeachtable:运行带有'?替换为每个表名。 如。

exec sp_msforeachtable "dbcc dbreindex('?')"

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

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

此外,sp_MSforeachdb


一个不太为人所知的TSQL技术,以随机顺序返回行:

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

连接字符串额外功能:

MultipleActiveResultSets = true;

这就产生了ADO。Net 2.0及以上版本在单个数据库连接上读取多个只向前、只读的结果集,如果要进行大量读取,这可以提高性能。即使是混合执行查询类型,也可以打开它。

应用程序名称= MyProgramName

现在,当您希望通过查询sysprocesses表来查看活动连接列表时,程序的名称将出现在program_name列中,而不是“”。Net SqlClient数据提供程序


下面是我写的一个查询,按最后修改日期列出所有DB用户对象:

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

表/存储过程过滤器是一个半隐藏的特性,非常有用…

在“SQL Server Management Studio对象资源管理器”中,右键单击“表或存储过程”文件夹,选择“筛选器”菜单,然后选择“筛选器设置”,并在“名称包含”行中输入部分名称。

同样地,使用Remove Filter再次查看所有表/存储过程。


仅限返回日期

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

or

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

查找日期落在当前周内的记录。

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 )

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

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

SQL Server 2005:

select * from sys.dm_os_performance_counters

select * from sys.dm_exec_requests

TableDiff.exe

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

Link


我发现这个小脚本非常方便地查看已经部署到服务器上的过程的文本:

DECLARE @procedureName NVARCHAR( MAX ), @procedureText NVARCHAR( MAX )

SET @procedureName = 'myproc_Proc1'

SET @procedureText =    (
                            SELECT  OBJECT_DEFINITION( object_id )
                            FROM    sys.procedures 
                            WHERE   Name = @procedureName
                        )

PRINT @procedureText

如果您想删除数据库中的所有过程-

SELECT  IDENTITY ( int, 1, 1 ) id, 
        [name] 
INTO    #tmp 
FROM    sys.procedures 
WHERE   [type]        = 'P' 
    AND is_ms_shipped = 0 

DECLARE @i INT 

SELECT   @i = COUNT( id ) FROM #tmp 
WHILE    @i > 0 
BEGIN 
   DECLARE @name VARCHAR( 100 ) 
   SELECT @name = name FROM #tmp WHERE id = @i 
   EXEC ( 'DROP PROCEDURE ' + @name ) 
   SET @i = @i-1 
END

DROP TABLE #tmp

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

sp_helptext 'ProcedureName'

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


在恢复数据库用于测试或其他用途时非常有用。正确地重新映射登录ID:

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

这不是一个隐藏的功能,而是在管理工作室的工具\选项\键盘下设置键映射: Alt+F1默认为sp_help“选定的文本”,但我不能没有添加Ctrl+F1为sp_helptext“选定的文本”


跟踪旗帜!“1204”在SQL Server 2000上的死锁调试中是无价的(2005有更好的工具)。


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

我最喜欢master..xp_cmdshell。它允许您从服务器上的命令提示符运行命令并查看输出。如果你不能登录到服务器,但你需要获取信息或以某种方式控制它,它是非常有用的。

例如,列出运行SQL server的服务器C:驱动器上的文件夹。

主. .Xp_cmdshell ` dir c:\ `

您还可以启动和停止服务。

主. .xp_cmdshell的sc查询“My . 服务”的 主. .xp_cmdshell 'sc stop“My . 服务”的 主. .xp_cmdshell 'sc start“My . 服务”的

它很强大,但也有安全隐患。许多人禁用它,因为它很容易被用来在服务器上做坏事。但是,如果你能接触到它,它会非常有用。


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

sp_help 'TableName'

@Gatekiller -一个更简单的方法来获得日期肯定是

CAST(CONVERT(varchar,getdate(),103) as datetime)

如果在本地不使用DD/MM/YYYY,则需要使用与103不同的值。SQL Books Online中的查找转换函数用于区域代码。


在Management Studio中,你可以在GO批处理结束标记后面放一个数字,以使批处理重复该次数:

PRINT 'X'
GO 10

将打印'X' 10次。这可以让你在做重复的事情时避免繁琐的复制/粘贴。


登录事件的触发器

Logon triggers can help complement auditing and compliance. For example, logon events can be used for enforcing rules on connections (for example limiting connection through a specific username or limiting connections through a username to a specific time periods) or simply for tracking and recording general connection activity. Just like in any trigger, ROLLBACK cancels the operation that is in execution. In the case of logon event that means canceling the connection establishment. Logon events do not fire when the server is started in the minimal configuration mode or when a connection is established through dedicated admin connection (DAC).

Link


Persisted-computed-columns

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

Link


在sys.database_principles中设置DEFAULT_SCHEMA

SQL Server在名称解析方面提供了极大的灵活性。然而,名称解析是有代价的,并且在不完全限定对象引用的临时工作负载中可能会显着昂贵。SQL Server 2005允许为每个数据库原则(也称为“user”)设置新的DEFEAULT_SCHEMA,这可以在不更改TSQL代码的情况下消除这种开销。

Link


强制参数化

参数化允许SQL Server利用查询计划重用,并避免后续执行类似查询时的编译和优化开销。然而,由于这样或那样的原因,仍然有许多应用程序存在特殊的查询编译开销。对于查询编译次数较多、降低CPU利用率和响应时间对工作负载至关重要的情况,强制参数化可以提供帮助。

Link


Vardecimal存储格式

SQL Server 2005为数字和十进制数据类型添加了一种新的存储格式,称为vardecimal。Vardecimal是十进制类型的一种变长表示,可以在行的每个实例中保存未使用的字节。如果十进制定义很大(如decimal(38,6)),但存储的值很小(如0.0),或者有大量重复值,或者数据填充稀疏,则可以节省最多的时间。

Link


找出最流行的查询

与系统。Dm_exec_query_stats,您可以通过一个查询计算出许多查询分析的组合。

链接 用命令

select * from sys.dm_exec_query_stats 
order by execution_count desc

可伸缩的共享数据库

通过可伸缩共享数据库,可以在普通机器上挂载相同的物理驱动器,并允许多个SQL Server 2005实例使用同一组数据文件。这种设置不需要为每个SQL Server实例复制存储,并且允许多个SQL Server实例具有额外的处理能力,这些实例具有自己的本地资源,如cpu、内存、tempdb和其他潜在的本地数据库。

Link


通过关键字查找过程

哪些过程包含特定的文本(表名、列名、变量名、TODO等)?

SELECT OBJECT_NAME(ID) FROM SysComments 
WHERE Text LIKE '%SearchString%' 
AND OBJECTPROPERTY(id, 'IsProcedure') = 1

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


这是我今天学到的一个,因为我需要搜索一笔交易。

:: fn_dblog 这允许您查询数据库的事务日志。

USE mydatabase;
SELECT *
FROM ::fn_dblog(NULL, NULL)

http://killspid.blogspot.com/2006/07/using-fndblog.html


以下是我最喜欢的一些东西:

在sp2 -工具/选项/脚本下增加了脚本选项

使用模式的新安全性—创建两个模式:user_access、admin_access。把你的用户过程放在一个,你的管理过程放在另一个,像这样:user_access。showList, admin_access.deleteUser。将模式上的EXECUTE授权给你的应用用户/角色。不再一直授予EXECUTE。

使用内置加密函数、视图(为了表示而解密)和带触发器的基表(在插入/更新时加密)进行加密。


好吧,这是我的观点:

http://dbalink.wordpress.com/2008/10/24/querying-the-object-catalog-and-information-schema-views/

我懒得在这里重新写一遍,所以请查看我的帖子。这对许多人来说可能是微不足道的,但会有一些人会发现它是一颗“隐藏的宝石”。

编辑:

过了一会儿,我决定在这里添加代码,这样您就不必跳转到我的博客来查看代码了。

SELECT  T.NAME AS [TABLE NAME], C.NAME AS [COLUMN NAME], P.NAME AS [DATA TYPE], P.MAX_LENGTH AS[SIZE],   CAST(P.PRECISION AS VARCHAR) +‘/’+ CAST(P.SCALE AS VARCHAR) AS [PRECISION/SCALE]
FROM ADVENTUREWORKS.SYS.OBJECTS AS T
JOIN ADVENTUREWORKS.SYS.COLUMNS AS C
ON T.OBJECT_ID=C.OBJECT_ID
JOIN ADVENTUREWORKS.SYS.TYPES AS P
ON C.SYSTEM_TYPE_ID=P.SYSTEM_TYPE_ID
WHERE T.TYPE_DESC=‘USER_TABLE’;

或者,如果你想拉出所有的用户表,像这样使用CURSOR:

DECLARE @tablename VARCHAR(60)

DECLARE cursor_tablenames CURSOR FOR
SELECT name FROM AdventureWorks.sys.tables

OPEN cursor_tablenames
FETCH NEXT FROM cursor_tablenames INTO @tablename

WHILE @@FETCH_STATUS = 0
BEGIN

SELECT  t.name AS [TABLE Name], c.name AS [COLUMN Name], p.name AS [DATA Type], p.max_length AS[SIZE],   CAST(p.PRECISION AS VARCHAR) +‘/’+ CAST(p.scale AS VARCHAR) AS [PRECISION/Scale]
FROM AdventureWorks.sys.objects AS t
JOIN AdventureWorks.sys.columns AS c
ON t.OBJECT_ID=c.OBJECT_ID
JOIN AdventureWorks.sys.types AS p
ON c.system_type_id=p.system_type_id
WHERE t.name = @tablename
AND t.type_desc=‘USER_TABLE’
ORDER BY t.name ASC

FETCH NEXT FROM cursor_tablenames INTO @tablename
END

CLOSE cursor_tablenames
DEALLOCATE cursor_tablenames

其他参考资料(我的博客):http://dbalink.wordpress.com/2009/01/21/how-to-create-cursor-in-tsql/


sp_executesql 

用于执行字符串中的语句。与Execute一样好,但可以返回参数


因为我是程序员,而不是DBA,所以我最喜欢的隐藏特性是SMO库。从数据库/表/列的创建和删除,到脚本编写,再到备份和恢复,在SQL Server中几乎任何事情都可以自动化。如果你能在SQL Server Management Studio中完成它,你也可以在SMO中自动化它。


不是无证

行号由Itzik Ben-Gan 提供 http://www.sqlmag.com/article/articleid/97675/sql_server_blog_97675.html

设置xact_abort为on 在事务发生错误时回滚所有内容

所有的sp_都很有帮助,只是在网上浏览书籍

我在管理工作室一直使用的快捷键 F6 -结果和查询之间切换 Alt+X或F5-在查询中运行选中的文本,如果没有选中则运行整个窗口 Alt+T和Alt+D -结果在文本或网格分别


我发现sp_depends很有用。它显示依赖于给定对象的对象,例如。

exec sp_depends 'fn_myFunction' 

返回依赖于此函数的对象(注意,如果对象最初没有按照正确的顺序运行到数据库中,将会给出错误的结果。)


EXCEPT和INTERSECT

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

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


在SQL Server 2005中,您不再需要运行sp-blocker-pss80存储过程。相反,你可以这样做:

exec sp_configure 'show advanced options', 1;
reconfigure;
go
exec sp_configure 'blocked process threshold', 30;
reconfigure; 

然后,您可以启动SQL跟踪,并在“错误和警告”组中选择“阻塞”流程报告事件类。详情请点击这里。


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

declare @orderby varchar(10)

set @orderby = 'NAME'

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

基于强硬的数据库开发人员对它的强烈反应,CLR集成应该排在前面。=)


这里有一些未记录的命令:未记录但很方便的SQL server Procs和DBCC命令


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

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

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


use db
go      
DECLARE @procName varchar(100)      
DECLARE @cursorProcNames CURSOR      
SET @cursorProcNames = CURSOR FOR      
select name from sys.procedures where modify_date > '2009-02-05 13:12:15.273' order by modify_date desc     

OPEN @cursorProcNames      
FETCH NEXT      
FROM @cursorProcNames INTO @procName      
WHILE @@FETCH_STATUS = 0      
BEGIN      
-- see the text of the last stored procedures modified on 
-- the db , hint Ctrl + T would give you the procedures test 
set nocount off;      
exec sp_HelpText @procName --- or print them      
-- print @procName      

FETCH NEXT      
FROM @cursorProcNames INTO @procName      
END      
CLOSE @cursorProcNames      

select @@error  

use db
go 

select o.name 
, (SELECT [definition] AS [text()] 
     FROM sys.all_sql_modules 
     WHERE sys.all_sql_modules.object_id=a.object_id 
     FOR XML PATH(''), TYPE
  )  AS Statement_Text
 , a.object_id
 , o.modify_date 

 FROM sys.all_sql_modules a 
 LEFT JOIN  sys.objects o ON a.object_id=o.object_id 
 ORDER BY  4 desc

--select * from sys.objects

获得垂直格式的列标题列表:

复制网格结果中的列名

工具-选项-查询结果- SQL Server -结果网格 勾选“在复制或保存结果时包含列标题”

此时,您需要建立一个新的连接,然后运行查询

现在,当您从网格复制结果时,您将获得列标题

也 然后将结果复制到excel

只复制col标头

粘贴特殊(不能与复制区域重叠)

蜱虫“转置”

OK

[你可能希望在这里添加一个","并自动填充]

您有一个垂直格式的列的即时列表


我不确定这是否是一个隐藏的功能,但我偶然发现了这个功能,并发现它在很多情况下都很有用。您可以在单个选择语句中连接一组字段,而不是使用游标并遍历选择语句。

例子:

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,

根据单个语句中管道分隔的id字符串返回结果(替代传递xml或首先将分隔的字符串转换为表)

例子:

DECLARE @nvcIDs nvarchar(max)
SET @nvcIDs = '|1|2|3|'

SELECT C.*
FROM tblCompany C
WHERE @nvcIDs LIKE '%|' + CAST(C.CompanyID as nvarchar) + '|%' 

执行一个存储过程,并在(temp)表中捕获结果,以便进一步处理,例如:

INSERT INTO someTable EXEC sp_someproc

示例:显示sp_help输出,但按数据库大小排序:

CREATE TABLE #dbs
(
    name nvarchar(50),
    db_size nvarchar(50),
    owner nvarchar(50),
    dbid int,
    created datetime,
    status nvarchar(255),
    compatiblity_level int
)
INSERT INTO #dbs EXEC sp_helpdb

SELECT * FROM #dbs 
ORDER BY CONVERT(decimal, LTRIM(LEFT(db_size, LEN(db_size)-3))) DESC

DROP TABLE #dbs

SQLCMD

如果您有脚本需要反复运行,但必须更改轻微的细节,那么在sqlcmd模式下运行ssms非常棒。sqlcmd命令行也非常漂亮。

我最喜欢的特点是:

你需要设置变量。适当的变量,不需要跳过sp_exec圈 您可以一个接一个地运行多个脚本 这些脚本可以引用“外部”脚本中的变量

Red Gate的Simpletalk没有再滔滔滔滔地说什么,而是对sqlcmd - sqlcmd工作台做了一个很棒的总结。Donabel Santos也有一些很棒的SQLCMD示例。


我用来将这个存储过程添加到主数据库,

改进:

修剪主机名,这样复制粘贴就可以在VNC上工作。 增加了一个LOCK选项,用于查看当前锁定的进程。

用法:

EXEC sp_who3 'ACTIVE' EXEC sp_who3 'LOCK' EXEC sp_who3 spid_No

就是这样。

CREATE procedure sp_who3
       @loginame sysname = NULL --or 'active' or 'lock'
as

declare  @spidlow   int,
         @spidhigh  int,
         @spid      int,
         @sid       varbinary(85)

select   @spidlow   =     0
        ,@spidhigh  = 32767


if @loginame is not NULL begin
    if upper(@loginame) = 'ACTIVE' begin
        select spid, ecid, status
            , loginame=rtrim(loginame)
            , hostname=rtrim(hostname)
            , blk=convert(char(5),blocked)
            , dbname = case
                            when dbid = 0 then null
                            when dbid <> 0 then db_name(dbid)
                        end
              ,cmd
        from  master.dbo.sysprocesses
        where spid >= @spidlow and spid <= @spidhigh AND
              upper(cmd) <> 'AWAITING COMMAND'
        return (0)
    end
    if upper(@loginame) = 'LOCK' begin
        select spid , ecid, status
            , loginame=rtrim(loginame)
            , hostname=rtrim(hostname)
            , blk=convert(char(5),blocked)
            , dbname = case
                            when dbid = 0 then null
                            when dbid <> 0 then db_name(dbid)
                        end
              ,cmd
        from  master.dbo.sysprocesses
        where spid >= 0 and spid <= 32767 AND
              upper(cmd) <> 'AWAITING COMMAND'
        AND convert(char(5),blocked) > 0
        return (0)
    end

end

if (@loginame is not NULL
   AND  upper(@loginame) <> 'ACTIVE'
   )
begin
    if (@loginame like '[0-9]%')    -- is a spid.
    begin
        select @spid = convert(int, @loginame)
        select spid, ecid, status
            , loginame=rtrim(loginame)
            , hostname=rtrim(hostname)
            , blk=convert(char(5),blocked)
            , dbname = case
                            when dbid = 0 then null
                            when dbid <> 0 then db_name(dbid)
                        end
              ,cmd
        from  master.dbo.sysprocesses
        where spid = @spid
    end
    else
    begin
        select @sid = suser_sid(@loginame)
        if (@sid is null)
        begin
            raiserror(15007,-1,-1,@loginame)
            return (1)
        end
        select spid, ecid, status
            , loginame=rtrim(loginame)
            , hostname=rtrim(hostname)
            , blk=convert(char(5),blocked)
            , dbname = case
                            when dbid = 0 then null
                            when dbid <> 0 then db_name(dbid)
                        end
               ,cmd
        from  master.dbo.sysprocesses
        where sid = @sid
    end
    return (0)
end


/* loginame arg is null */
select spid,
       ecid,
       status
       , loginame=rtrim(loginame)
       , hostname=rtrim(hostname)
       , blk=convert(char(5),blocked)
       , dbname = case
                    when dbid = 0 then null
                    when dbid <> 0 then db_name(dbid)
                end
       ,cmd
from  master.dbo.sysprocesses
where spid >= @spidlow and spid <= @spidhigh


return (0) -- sp_who

好吧,这是我剩下的一些,很遗憾我错过了开始,但继续吧,这里有一些顶级的东西!

查询分析器

Alt+F1对所选文本执行sp_help Alt-D -聚焦到数据库下拉菜单,这样你就可以使用字母光标键选择db。

t - sql

if (object_id("nameofobject") IS NOT NULL) begin <do something> end -最简单的存在性检查 Sp_locks——比sp_who2(这是第一个调用端口)更深入的锁定信息 DBCC inputbuffer(spid) -执行进程的顶部行列表(有点有用,但简单) DBCC outputbuffer(spid) -执行进程输出的顶行列表

通用T-sql技巧

对于大容量的数据,可以自由地使用子查询来处理集合中的数据

例如,获得已婚人士的名单 50岁以上的人可以选择 一群结婚的人 子查询并与一组 同样是50岁以上的人 加入结果-请原谅 的例子


CTRL-E在查询分析器中执行当前选择的文本。


许多SQL Server开发人员似乎仍然不知道DELETE、INSERT和UPDATE语句中的OUTPUT子句(SQL Server 2005及更新版本)。

知道哪些行被插入、更新或删除是非常有用的,OUTPUT子句可以很容易地做到这一点——它允许访问称为插入和删除的“虚拟”表(就像在触发器中一样):

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)

如果你正在更新,知道发生了什么变化是非常有用的——在这种情况下,插入表示更新之后的新值,而删除则指更新之前的旧值:

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

如果将返回大量信息,output的输出也可以重定向到临时表或表变量(output INTO @myInfoTable)。

非常有用——却鲜为人知!

Marc


使用osql实用程序运行命令行查询/脚本/批处理


这里有一个简单但有用的例子:

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


Sql 2000 + DBCC DROPCLEANBUFFERS:清除缓冲区。当缓冲区是干净的时,用于测试查询的速度。


在SQL Server Management Studio (SSMS)中,您可以在对象资源管理器中突出显示对象名称,并按Ctrl-C将该名称复制到剪贴板。

不需要按F2或右键,重命名对象复制名称。

您还可以将对象从对象资源管理器拖放到查询窗口中。


行构造函数

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

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

批分离器

大多数人都不知道“GO”不是SQL命令。它是客户端工具使用的默认批处理分隔符。你可以在Books Online找到更多信息。

您可以通过在Management Studio中选择“Tools -> Options”,并在“查询执行”部分更改批量分隔符选项来更改批量分隔符选项。

我不知道为什么你想这样做,除了作为一个恶作剧,但这是一个有点有趣的琐事。


下面是一些我喜欢的SQL Management Studio隐藏特性。

我喜欢的一点是,如果你在高亮显示信息时按住ALT键,你可以选择柱状信息,而不仅仅是整行。

在SQL Management Studio中,你有预定义的快捷键:

Ctrl+1运行sp_who Ctrl+2运行sp_lock Alt+F1运行sp_help Ctrl+F1运行sp_helptext

因此,如果您在编辑器中突出显示表名并按Alt+F1,它将显示表的结构。


Use

从information_schema中选择*

列出所有的数据库,基本表,sps,视图等在SQL server。


替代Kolten的sp_change_users_login:

ALTER USER wacom_app WITH LOGIN = wacom_app

Stored proc sp_MSdependencies以一种比sp_depends更有用的方式告诉您对象依赖关系。对于某些产品版本,可以方便地暂时禁用子表约束,应用更改然后重新启用子表约束。这是查找依赖于父表的对象的好方法。

这段代码禁用了子表约束:

create table #deps
( oType int,
  oObjName sysname,
  oOwner nvarchar(200),
  oSequence int
)

insert into #deps  
exec sp_MSdependencies @tableName, null, 1315327

exec sp_MSforeachtable @command1 = 'ALTER TABLE ? NOCHECK CONSTRAINT ALL',
@whereand = ' and o.name in (select oObjName from #deps where oType = 8)'

应用更改后,可以运行以下代码重新启用约束:

exec sp_MSforeachtable @command1 = 'ALTER TABLE ? WITH CHECK CHECK CONSTRAINT ALL',
@whereand = ' and o.name in (select oObjName from #deps where oType = 8)'

第三个参数是@flags,它控制列出的依赖项类型。请阅读proc内容,了解如何根据自己的目的更改@flags。该过程使用位掩码来破译您想要返回的内容。


在Management Studio中,您可以通过以下方法快速获得一个以逗号分隔的表列列表:

在对象资源管理器中,展开给定表下的节点(这样你会看到列、键、约束、触发器等文件夹)。 指向Columns文件夹并拖动到查询中。

当你不想使用令人发指的返回格式时,右键单击表格并选择Script table As…插入到…这个技巧也适用于其他文件夹,因为它将为您提供文件夹中包含的逗号分隔的名称列表。


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及更高版本中可用


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

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

BCP_IN和BCP_OUT完美的批量数据导入和导出


空间结果选项卡可以用来创建艺术。

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


SQL Server Management Studio键盘快捷键…这将使日常工作的结果越来越快。http://sqlserver-qa.net/blogs/tools/archive/2007/04/25/management-studio-shortcut-keys.aspx


你是否曾经不小心点击了执行按钮,而你实际上想点击: 调试/解析/使用数据库/查询选项卡之间的切换/等?

下面是把按钮移到安全的地方的方法:

工具—>自定义。然后拖动按钮到你想要的地方

你还可以: -添加/删除其他常用/不常用的按钮(甚至适用于菜单栏中的命令,如文件/编辑) -改变按钮的图标图像(见下面的小猪改变按钮图像..lol)


使用GETDATE() +或-来计算附近的日期

SELECT GETDATE() - 1 -- yesterday, 1 day ago, 24 hours ago
SELECT GETDATE() - .5 -- 12 hours ago
SELECT GETDATE() - .25 -- 6 hours ago
SELECT GETDATE() - (1 / 24.0) -- 1 hour ago (implicit decimal result after division)

主. .Spt_values(特别是type='p')对于字符串分割和执行'bin '和时间插值操作非常有用。


您可以用子查询创建一个逗号分隔的列表,并且后面没有最后一个逗号。据说这比之前使用的函数更有效。我想是2005年之后。

SELECT 
    Project.ProjectName,
    (SELECT
        SUBSTRING(
            (SELECT ', ' + Site.SiteName
            FROM Site
            WHERE Site.ProjectKey = Project.ProjectKey
            ORDER BY Project.ProjectName
    FOR XML PATH('')),2,200000)) AS CSV 
FROM Project

您还可以使用带有嵌套查询的FOR XML PATH来选择XML,我发现这很有用。


Sp_lock:显示当前所有锁。返回的数据还可以进一步查询:

Spid -与sp_who一起使用它来查看谁拥有锁。

Objid -与select object_name(Objid)一起使用,查看哪个数据库对象被锁定。


我想推荐一个免费的插件SSMS工具包,它有很多功能,如

代码片段

你不再需要自己输入SELECT * FROM。只需输入SSF并按enter(可以自定义为任何其他键)。我更喜欢Tab)。其他有用的代码片段很少

SSC +标签-选择计数(*)从

SST + tab -选择TOP 10 * FROM

S +选项卡-选择

I + tab -插入

U + tab - UPDATE

W + tab - WHERE

OB + tab - ORDER BY

这样的例子不胜枚举。您可以使用SSMS Tools Pack菜单检查和自定义整个列表

执行日志记录

您是否意识到您可以保存几天前编写的临时查询,这样您就不需要再次重新发明轮子了?SSMS Tools包保存您的所有执行历史,您可以根据日期或查询中的任何文本进行搜索。

搜索数据库数据

这个特性可以帮助您搜索字符串在整个数据库中的出现情况,并显示表名和列名以及出现的总数。您可以通过在对象资源管理器中右键单击数据库并选择搜索数据库数据来使用此功能。

SQL格式

将所有关键字设置为大写或小写字母。右键单击查询窗口并选择格式文本。您可以在SSMS工具菜单中设置快捷键。但它缺乏对齐功能。

CRUD SP生成

右键单击一个表,SSMS Tools - > Create CRUD生成插入、更新、删除和选择SP。SP的内容可以使用SSMS Tools菜单定制。

Misc

其他特性很少

以网格模式搜索结果。 从结果集,表和数据库生成插入脚本。 执行计划分析器。 在多个数据库中运行一个脚本。

要了解更多信息,您可以访问他们的功能页面


我使用SSMS在操作系统硬盘上的文件中查找文本。它使它超级容易编写正则表达式和筛选任何目录来替换或查找文本。我总是发现这比使用windows更容易。