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


当前回答

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

改进:

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

其他回答

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

PRINT 'X'
GO 10

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

SQL Server 2005:

select * from sys.dm_os_performance_counters

select * from sys.dm_exec_requests

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

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 )

好吧,这是我的观点:

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/

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