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


当前回答

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

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

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

其他回答

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

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

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

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

改进:

修剪主机名,这样复制粘贴就可以在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

本周我学到的最令人惊讶的事情是在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

下面是一些我喜欢的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,它将显示表的结构。

许多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