215

SQL Server有哪些隐藏的功能?

例如,未记录的系统存储过程,做一些非常有用但记录不足的事情的技巧?


答案

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

存储过程

  • sp_msforeachtable:运行带有“?”的命令 替换为每个表名(v6.5 及更高版本)
  • sp_msforeachdb:运行带有“?”的命令 替换为每个数据库名称(v7 及更高版本)
  • sp_who2:与 sp_who 类似,但有更多信息用于块故障排除(v7 及更高版本)
  • sp_helptext:如果要存储过程的代码,查看&UDF
  • sp_tables:返回范围内数据库的所有表和视图的列表。
  • sp_stored_procedures:返回所有存储过程的列表
  • xp_sscanf:将字符串中的数据读取到每个格式参数指定的参数位置。
  • xp_fixeddrives: : 找到可用空间最大的固定驱动器
  • sp_help:如果你想知道一个表的表结构、索引和约束。还有视图和 UDF。快捷键是 Alt+F1

片段

  • 以随机顺序返回行
  • 按上次修改日期的所有数据库用户对象
  • 仅返回日期
  • 查找日期在当前周内某处的记录。
  • 查找上周发生日期的记录。
  • 返回当前周开始的日期。
  • 返回上周开始的日期。
  • 查看已部署到服务器的过程的文本
  • 删除与数据库的所有连接
  • 表校验和
  • 行校验和
  • 删除数据库中的所有过程
  • 恢复后正确重新映射登录 ID
  • 从 INSERT 语句调用存储过程
  • 按关键字查找程序
  • 删除数据库中的所有过程
  • 以编程方式查询数据库的事务日志。

功能

  • 哈希字节()
  • 密钥加密
  • PIVOT 命令

杂项

  • 连接字符串附加功能
  • TableDiff.exe
  • 登录事件触发器(Service Pack 2 中的新增功能)
  • 使用持久计算列 (pcc) 提高性能。
  • sys.database_principles 中的 DEFAULT_SCHEMA 设置
  • 强制参数化
  • Vardecimal 存储格式
  • 在几秒钟内找出最受欢迎的查询
  • 可扩展的共享数据库
  • SQL Management Studio 中的表/存储过程过滤器功能
  • 跟踪标志
  • aGO重复批次后的编号
  • 使用模式的安全性
  • 使用带有触发器的内置加密函数、视图和基表进行加密
4

84 回答 84

91

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

PRINT 'X'
GO 10

将打印 'X' 10 次。这可以使您在做重复性工作时免于繁琐的复制/粘贴。

于 2008-09-26T18:13:54.563 回答
70

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

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

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)。

非常有用——而且鲜为人知!

马克

于 2009-08-07T09:03:38.943 回答
52

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

exec sp_msforeachtable "dbcc dbreindex('?')"

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

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

还,sp_MSforeachdb

于 2008-09-23T15:10:24.867 回答
51

Connection String extras:

MultipleActiveResultSets=true;

This makes ADO.Net 2.0 and above read multiple, forward-only, read-only results sets on a single database connection, which can improve performance if you're doing a lot of reading. You can turn it on even if you're doing a mix of query types.

Application Name=MyProgramName

Now when you want to see a list of active connections by querying the sysprocesses table, your program's name will appear in the program_name column instead of ".Net SqlClient Data Provider"

于 2008-09-23T15:21:30.270 回答
33

TableDiff.exe

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

关联

于 2008-09-23T16:09:25.333 回答
31

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

-- Return rows in a random order
SELECT 
    SomeColumn 
FROM 
    SomeTable
ORDER BY 
    CHECKSUM(NEWID())
于 2008-09-23T15:13:40.990 回答
30

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

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

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

于 2010-07-20T15:22:36.447 回答
23

行构造函数

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

INSERT INTO Colors (id, Color)
VALUES (1, 'Red'),
       (2, 'Blue'),
       (3, 'Green'),
       (4, 'Yellow')
于 2009-12-18T19:39:27.307 回答
22

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

sp_help 'TableName'
于 2008-09-26T14:54:03.107 回答
22

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

于 2008-09-23T14:21:35.373 回答
20

找出最受欢迎的查询

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

与命令链接

select * from sys.dm_exec_query_stats 
order by execution_count desc
于 2008-09-29T17:03:14.253 回答
16

在为测试目的或其他目的恢复数据库时很有用。正确重新映射登录 ID:

EXEC sp_change_users_login 'Auto_Fix', 'Mary', NULL, 'B3r12-36'
于 2008-09-23T17:56:07.870 回答
16

除了和相交

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

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

于 2008-11-25T19:36:01.380 回答
16

我知道它并没有完全隐藏,但没有太多人知道​​ PIVOT命令。我能够更改一个使用游标的存储过程,并且需要 2 分钟才能快速运行 6 秒的代码,该代码是行数的十分之一!

于 2008-10-08T23:36:51.570 回答
15

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

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
于 2008-09-23T15:56:16.393 回答
15

表校验和

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

行校验和

Select CheckSum_Agg(Binary_CheckSum(*)) From Table With (NOLOCK) Where Column = Value
于 2008-09-23T15:56:53.443 回答
15

我不确定这是否是一个隐藏功能,但我偶然发现了这一点,并发现它在许多场合都很有用。您可以在单个 select 语句中连接一组字段,而不是使用游标并循环通过 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,
于 2009-05-21T18:10:32.420 回答
14

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

sp_helptext 'ProcedureName'

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

于 2008-09-23T16:56:14.503 回答
13

一个存储过程技巧是您可以从 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
于 2008-09-26T08:58:55.500 回答
12

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

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

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

于 2009-02-10T15:22:30.683 回答
10

用于解析存储过程参数: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
于 2008-09-23T14:47:43.407 回答
9

仅返回日期

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

或者

Select DateAdd(Day, 0, DateDiff(Day, 0, Getdate()))
于 2008-09-23T15:54:23.467 回答
9

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

于 2010-08-30T15:40:59.587 回答
7

持久计算列

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

关联

于 2008-09-29T17:00:54.993 回答
7

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

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 )
于 2008-09-23T15:55:41.823 回答
7

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

于 2008-09-23T23:17:05.227 回答
7

There are times when there's no suitable column to sort by, or you just want the default sort order on a table and you want to enumerate each row. In order to do that you can put "(select 1)" in the "order by" clause and you'd get what you want. Neat, eh?

select row_number() over (order by (select 1)), * from dbo.Table as t
于 2010-09-05T15:37:31.463 回答
7

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

sp_tables

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

关联

sp_stored_procedures

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

关联

于 2008-09-23T14:18:59.937 回答
6

使用EncryptByKey进行简单加密

于 2008-09-23T14:34:16.340 回答
6

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

EXEC master..xp_fixeddrives

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

EXEC master..xp_fileexist 'C:\file_you_want_to_check'

更多细节在这里

于 2008-09-23T15:09:22.047 回答
6

本周我学到的最令人惊讶的事情涉及在 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
于 2008-11-26T15:43:39.977 回答
6

SQLCMD

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

我最喜欢的功能是:

  • 你可以设置变量。不需要跳过 sp_exec 循环的正确变量
  • 您可以一个接一个地运行多个脚本
  • 这些脚本可以引用“外部”脚本中的变量

Red Gate 的 Simpletalk 不再滔滔不绝,而是对 sqlcmd - The SQLCMD Workbench做了一个很棒的总结。Donabel Santos 也有一些很棒的SQLCMD 示例

于 2009-06-23T09:53:23.417 回答
6

这是一个简单但有用的:

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

于 2009-12-07T16:01:31.277 回答
5

Here is a query I wrote to list All DB User Objects by Last Modified Date:

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
于 2008-09-23T15:36:33.057 回答
4

批处理分隔符

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

您可以通过在 Management Studio 中选择工具 -> 选项并更改查询执行部分中的批处理分隔符选项来更改批处理分隔符。

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

于 2009-12-18T20:12:05.133 回答
4
sp_executesql 

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

于 2008-10-24T16:21:10.713 回答
4

sp_who2,就像 sp_who,但有更多信息用于故障排除块

于 2008-09-23T15:06:08.963 回答
4

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

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
于 2008-09-23T16:43:33.207 回答
4

使用或计算附近的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)
于 2011-07-14T21:21:39.107 回答
4

按关键字查找程序

哪些程序包含某段文本(表名、列名、变量名、TODO 等)?

SELECT OBJECT_NAME(ID) FROM SysComments 
WHERE Text LIKE '%SearchString%' 
AND OBJECTPROPERTY(id, 'IsProcedure') = 1
于 2008-10-01T21:26:32.390 回答
4

跟踪标志!“1204”在 SQL Server 2000 上的死锁调试中非常有用(2005 有更好的工具)。

于 2008-09-24T13:11:34.893 回答
4

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

查询分析器

  • Alt+F1sp_help在选定的文本上执行
  • Alt-D- 关注数据库下拉列表,以便您可以使用带有字母光标键的 select 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 岁以上的相同人并输出合并结果 - 请原谅人为的示例

于 2009-06-30T20:28:57.747 回答
3

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

无需按 F2 或右键单击,重命名对象即可复制名称。

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

于 2009-12-18T19:36:19.747 回答
2

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

于 2009-12-18T14:23:58.037 回答
2

登录事件的触发器

  • 登录触发器可以帮助补充审计和合规性。例如,登录事件可用于强制执行连接规则(例如,通过特定用户名限制连接或通过用户名将连接限制在特定时间段)或仅用于跟踪和记录一般连接活动。就像在任何触发器中一样,ROLLBACK 取消正在执行的操作。在登录事件的情况下,这意味着取消连接建立。当服务器以最小配置模式启动或通过专用管理连接 (DAC) 建立连接时,不会触发登录事件。

关联

于 2008-09-29T17:00:24.107 回答
2

由于我是程序员,而不是 DBA,所以我最喜欢的隐藏功能是SMO 库。您可以在 SQL Server 中自动化几乎任何事情,从数据库/表/列的创建和删除到脚本到备份和恢复。如果您可以在 SQL Server Management Studio 中执行此操作,则可以在 SMO 中自动执行此操作。

于 2008-10-24T16:36:34.567 回答
2

Based on what appears to be a vehement reaction to it by hardened database developers, the CLR integration would rank right up there. =)

于 2009-01-07T19:08:36.860 回答
2

My favorite is master..xp_cmdshell. It allows you to run commands from a command prompt on the server and see the output. It's extremely useful if you can't login to the server, but you need to get information or control it somehow.

For example, to list the folders on the C: drive of the server where SQL Server is running.

  • master..xp_cmdshell 'dir c:\'

You can start and stop services, too.

  • master..xp_cmdshell 'sc query "My Service"'

  • master..xp_cmdshell 'sc stop "My Service"'

  • master..xp_cmdshell 'sc start "My Service"'

It's very powerful, but a security risk, also. Many people disable it because it could easily be used do bad things on the server. But, if you have access to it, it can be extremely useful.

于 2008-09-26T14:31:04.300 回答
2

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

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

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

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

于 2008-10-16T02:02:57.983 回答
2

存储过程 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。proc 使用位掩码来破译您想要返回的内容。

于 2010-07-20T14:46:19.097 回答
1

sys.database_principles 中的 DEFAULT_SCHEMA 设置

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

关联

于 2008-09-29T17:01:31.653 回答
1

一个半隐藏的功能,表/存储过程过滤器功能真的很有用......

SQL Server Management Studio Object Explorer中,右键单击TablesStored Procedures文件夹,选择Filter菜单,然后选择Filter Settings ,然后在Name contains行中输入部分名称。

同样,使用删除过滤器再次查看所有表/存储过程。

于 2008-09-23T15:49:19.220 回答
1

当你真正想要点击:
调试/解析/使用数据库/在查询选项卡之间切换/等时,你是否曾经不小心点击了执行按钮?

这是一种将该按钮移动到安全位置的方法:

工具 -> 自定义。并将按钮拖动到您想要的位置

您还可以:
- 添加/删除其他常用/未使用的按钮(甚至适用于菜单栏中的命令,例如文件/编辑)
- 更改按钮的图标图像(请参阅更改按钮图像下的小猪..哈哈)

于 2011-05-26T00:48:49.107 回答
1

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

在网格结果中复制列名

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

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

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

另外,如果您然后将结果复制到excel

仅复制 col 标题

选择性粘贴(不得与复制区域重叠)

勾选“转置”

好的

[您可能希望添加一个“,”并在此时自动填充]

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

于 2009-03-31T13:41:10.770 回答
1

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

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
于 2008-09-23T16:46:28.490 回答
1

Vardecimal 存储格式

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

关联

于 2008-09-29T17:02:46.313 回答
1

可扩展的共享数据库

  • 通过可扩展共享数据库,人们可以在商用机器上安装相同的物理驱动器,并允许 SQL Server 2005 的多个实例处理同一组数据文件。该设置不需要为每个 SQL Server 实例提供重复存储,并允许通过多个 SQL Server 实例提供额外的处理能力,这些实例拥有自己的本地资源,如 cpu、内存、tempdb 和可能的其他本地数据库。

关联

于 2008-09-29T17:03:32.647 回答
1

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

于 2009-09-01T19:00:27.727 回答
1

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

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
于 2009-05-29T14:18:09.120 回答
1

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

于 2010-01-08T00:56:15.420 回答
1

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

代码片段

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

SSC + 制表符 - 选择 COUNT(*) FROM

SST + 制表符 - 选择 TOP 10 * FROM

S + 制表符 - 选择

I + 制表符 - 插入

U + 制表符 - 更新

W + 制表符 - 在哪里

OB + 制表符 - ORDER BY

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

执行日志历史

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

搜索数据库数据

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

格式化 SQL

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

CRUD SP 生成

右键单击一个表,SSMS Tools -> Create CRUD 以生成 Insert、Update、Delete 和 Select SP。可以使用 SSMS 工具菜单自定义 SP 的内容。

杂项

很少有其他功能是

  1. 网格模式下的搜索结果。
  2. 从结果集、表和数据库生成插入脚本。
  3. 执行计划分析器。
  4. 在多个数据库中运行一个脚本。

有关更多信息,您可以访问他们的功能页面

于 2011-12-10T15:44:41.360 回答
0

没有无证

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

SET XACT_ABORT ON 回滚所有错误的事务

所有的 sp_ 都很有帮助,只需在线浏览书籍

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

于 2008-10-24T18:08:37.127 回答
0

对于 SQL Server 2005:

select * from sys.dm_os_performance_counters

select * from sys.dm_exec_requests
于 2008-09-23T16:05:02.427 回答
0

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

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

然后,您可以启动 SQL 跟踪并在错误和警告组中选择阻塞进程报告事件类。该事件的详细信息在这里

于 2008-11-25T19:57:47.950 回答
0

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

于 2009-01-07T20:45:59.847 回答
0

@Gatekiller - 获取日期的更简单方法肯定是

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

如果在您的语言环境中不使用 DD/MM/YYYY,则需要使用与 103 不同的值。在 SQL 联机丛书中查找 CONVERT 函数以获取语言环境代码。

于 2008-09-26T17:18:55.130 回答
0

好的,这是我的 2 美分:

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/

于 2008-10-24T07:44:26.603 回答
0

I use SSMS to find text in files on the OS harddrive. It makes it super easy to write regex and sift through any directory to replace or find text. I always found this easier then using windows.

于 2012-01-04T04:02:05.767 回答
0

强制参数化

  • 参数化允许 SQL Server 利用查询计划重用的优势,并避免在后续执行类似查询时产生编译和优化开销。然而,由于某种原因,有许多应用程序仍然受到临时查询编译开销的影响。对于具有大量查询编译以及降低 CPU 利用率和响应时间对您的工作负载至关重要的情况,强制参数化可以提供帮助。

关联

于 2008-09-29T17:02:20.030 回答
0

我最喜欢的一些东西:

在 sp2 中添加 - 工具/选项/脚本下的脚本选项

使用模式的新安全性 - 创建两个模式:user_access、admin_access。将您的用户过程放在一个中,将您的管理员过程放在另一个中,如下所示: user_access.showList , admin_access.deleteUser 。将架构上的 EXECUTE 授予您的应用用户/角色。不再一直授予执行。

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

于 2008-10-20T18:49:30.197 回答
0
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  
于 2009-02-12T19:42:08.420 回答
0

BCP_IN 和 BCP_OUT 非常适合 BULK 数据导入和导出

于 2010-10-07T11:01:43.600 回答
0

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

exec sp_depends 'fn_myFunction' 

返回依赖于这个函数的对象(注意,如果对象最初没有以正确的顺序运行到数据库中,这将给出不正确的结果。)

于 2008-11-04T18:36:12.233 回答
0

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

例子:

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

SELECT C.*
FROM tblCompany C
WHERE @nvcIDs LIKE '%|' + CAST(C.CompanyID as nvarchar) + '|%' 
于 2009-05-21T18:17:19.240 回答
0

您可以使用子查询创建逗号分隔列表,并且没有最后一个尾随逗号。据说这比在此之前使用的功能更有效。我认为是 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。

于 2011-11-09T19:54:42.803 回答
0
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
于 2009-02-12T20:18:12.420 回答
0

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

改进:

  • 修剪主机名,以便复制粘贴在 VNC 上工作。
  • 添加了 LOCK 选项,仅用于查看当前锁定的进程。

用法:

  • 执行 sp_who3 '活动'
  • 执行 sp_who3 'LOCK'
  • 执行 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
于 2009-06-30T13:26:12.290 回答
0

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

于 2009-07-16T21:09:07.057 回答
0

利用

从 information_schema 中选择 *

列出 sql server 中的所有数据库、基表、sps、视图等。

于 2010-07-02T09:36:21.720 回答
0

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

于 2011-03-24T08:32:43.590 回答
0

master..spt_values(特别是 type='p')对于字符串拆分、“binning”和时间插值操作非常有用。

于 2011-10-25T13:44:40.477 回答
0

替代 Kolten 的 sp_change_users_login:

ALTER USER wacom_app WITH LOGIN = wacom_app
于 2010-07-19T06:50:41.183 回答
0

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

spid - 使用它sp_who来查看谁拥有锁。

objid - 使用它select object_name(objid)来查看哪个数据库对象被锁定。

于 2011-11-21T18:08:28.737 回答