SQL Server的隐藏功能

时间:2008-09-23 14:13:43

标签: sql-server tsql

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

片段

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

功能

  • HASHBYTES()
  • EncryptByKey的
  • PIVOT命令

其它

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

84 个答案:

答案 0 :(得分:91)

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

PRINT 'X'
GO 10

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

答案 1 :(得分:70)

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

知道哪些行已被INSERTed,UPDATEd或DELETEd非常有用,并且OUTPUT子句允许非常容易地执行此操作 - 它允许访问名为inserted和{{的“虚拟”表。 1}}(如在触发器中):

deleted

如果要将值插入具有INT IDENTITY主键字段的表,并使用OUTPUT子句,则可以立即获取插入的新ID:

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

如果你正在更新,知道改变了什么是非常有用的 - 在这种情况下,INSERT INTO MyTable(Field1, Field2) OUTPUT inserted.ID VALUES (Value1, Value2) 表示新值(在UPDATE之后),而inserted指的是旧值在更新之前:

deleted

如果返回大量信息,OUTPUT的输出也可以重定向到临时表或表变量(UPDATE (table) SET field1 = value1, field2 = value2 OUTPUT inserted.ID, deleted.field1, inserted.field1 WHERE (condition) )。

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

马克

答案 2 :(得分:52)

sp_msforeachtable:使用'?'运行命令替换为每个表名。 e.g。

exec sp_msforeachtable "dbcc dbreindex('?')"

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

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

此外,sp_MSforeachdb

答案 3 :(得分:51)

连接字符串附加:

<强> MultipleActiveResultSets = TRUE;

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

应用程序名称= MyProgramName

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

答案 4 :(得分:33)

<强> TableDiff.exe

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

Link

答案 5 :(得分:31)

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

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

答案 6 :(得分:30)

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

  1. 在对象资源管理器中,展开给定表下的节点(这样您将看到列,键,约束,触发器等的文件夹。)
  2. 指向Columns文件夹并拖入查询。
  3. 当您不想使用通过右键单击表并选择Script Table As ...返回时发出的令人发指的格式时,这很方便,然后插入到...这个技巧可以与其他文件夹一起使用将为您提供逗号分隔的文件夹中包含的名称列表。

答案 7 :(得分:23)

行构造函数

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

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

答案 8 :(得分:22)

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

答案 9 :(得分:22)

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

sp_help 'TableName'

答案 10 :(得分:20)

找出最热门的查询

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

Link 与commnad

select * from sys.dm_exec_query_stats 
order by execution_count desc

答案 11 :(得分:17)

答案 12 :(得分:16)

<强> EXCEPT and INTERSECT

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

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

答案 13 :(得分:16)

我知道它并没有完全隐藏,但没有太多人知道​​PIVOT命令。我能够更改一个使用游标的存储过程,并花了2分钟时间遇到速度为6秒的代码,这个代码只有行数的十分之一!

答案 14 :(得分:16)

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

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

答案 15 :(得分:15)

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

答案 16 :(得分: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

答案 17 :(得分:15)

表格校验和

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

行校验和

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

答案 18 :(得分:14)

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

sp_helptext 'ProcedureName'

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

答案 19 :(得分: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

答案 20 :(得分: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)中的数据进行排序,并根据排序结果分配数字。

答案 21 :(得分: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

答案 22 :(得分:9)

仅限退货日期

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

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

答案 23 :(得分: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 - What is the date/time of the last inserted row of a table?

在SQL 2005及更高版本中可用

答案 24 :(得分:7)

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

sp_tables
  

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

Link

sp_stored_procedures
  

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

Link

答案 25 :(得分: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 )

答案 26 :(得分:7)

<强>持久保存计算的柱

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

Link

答案 27 :(得分:7)

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

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

答案 28 :(得分:7)

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

答案 29 :(得分:6)

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

EXEC master..xp_fixeddrives

/ *在使用或参考* /

之前检查有关文件的假设
EXEC master..xp_fileexist 'C:\file_you_want_to_check'

More details here

答案 30 :(得分: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

答案 31 :(得分:6)

使用EncryptByKey

进行简单加密

答案 32 :(得分:6)

SQLCMD

如果您的脚本经常反复运行,但必须更改细节,那么在sqlcmd mode中运行ssms非常棒。 sqlcmd command line也非常漂亮。

我最喜欢的功能是:

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

Red Gate的Simpletalk不再滔滔不绝,而是对sqlcmd进行了精彩的整理 - The SQLCMD Workbench。 Donabel Santos也有一些很棒SQLCMD examples

答案 33 :(得分:6)

这是一个简单但有用的方法:

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

答案 34 :(得分:5)

以下是我编写的用于按上次修改日期列出所有数据库用户对象的查询:

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

答案 35 :(得分:4)

按关键字查找程序

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

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

答案 36 :(得分:4)

批处理分隔符

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

您可以通过选择工具 - &gt;更改批处理分隔符。 Management Studio中的选项,以及更改“查询执行”部分中的“批处理分隔符选项”。

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

答案 37 :(得分:4)

Trace Flags! “1204”在SQL Server 2000上的死锁调试中是非常宝贵的(2005年有更好的工具)。

答案 38 :(得分:4)

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

答案 39 :(得分:4)

sp_executesql 

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

答案 40 :(得分: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)

答案 41 :(得分:4)

好的,这是我剩下的一些,遗憾的是我错过了开始,但保持它在这里有一些顶级的东西!

查询分析器

  • Alt+F1对所选文字执行sp_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提示

  • 大量使用子查询来集中处理数据集
  

e.g。获得已婚人士名单   超过五十的人你可以选择一个   一群人结婚了   子查询并加入一组   同样的人超过50并输出   加入结果 - 请原谅   人为的例子

答案 42 :(得分: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

答案 43 :(得分:3)

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

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

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

答案 44 :(得分:2)

基于强化的数据库开发人员对它的强烈反应,CLR集成将在那里排名靠前。 =)

答案 45 :(得分: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使用位掩码来破译你想要返回的内容。

答案 46 :(得分:2)

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

答案 47 :(得分:2)

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

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

  • master..xp_cmdshell'dir c:\'

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

  • master..xp_cmdshell'ssc query“我的 服务“的”

  • master..xp_cmdshell'sc stop“我的 服务“的”

  • master..xp_cmdshell'sc start“我的 服务“的”

它非常强大,但也存在安全风险。许多人禁用它,因为它很容易被用来做服务器上的坏事。但是,如果您可以访问它,它可能非常有用。

答案 48 :(得分:2)

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

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

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

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

答案 49 :(得分:2)

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

答案 50 :(得分:2)

登录事件的触发器

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

Link

答案 51 :(得分:1)

可扩展的共享数据库

  • 通过可伸缩共享数据库,可以在商用计算机上安装相同的物理驱动器,并允许多个SQL Server 2005实例使用同一组数据文件。该安装程序不需要为每个SQL Server实例提供重复存储,并允许通过具有自己的本地资源(如cpu,memory,tempdb和其他可能的本地数据库)的多个SQL Server实例提供额外的处理能力。

Link

答案 52 :(得分:1)

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

答案 53 :(得分:1)

执行存储过程并将结果捕获到(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

答案 54 :(得分: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,它将显示表的结构。

答案 55 :(得分:1)

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

在网格结果中复制列名称

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

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

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

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

仅复制col标题

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

勾选“Transpose”

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

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

答案 56 :(得分:1)

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

这是一种在某个地方安全地移动该按钮的方法:

工具 - &gt;自定义。并在您想要的位置拖动按钮

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

答案 57 :(得分:1)

Vardecimal存储格式

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

Link

答案 58 :(得分:1)

sys.database_principles中的DEFAULT_SCHEMA设置

  • SQL Server为名称解析提供了极大的灵活性。但是,名称解析需要付出代价,并且在不完全限定对象引用的特殊工作负载中会显得昂贵。 SQL Server 2005允许为每个数据库原则(也称为“用户”)设置DEFEAULT_SCHEMA的新设置,这可以在不更改TSQL代码的情况下消除此开销。

Link

答案 59 :(得分:1)

我想推荐一个免费的加载项SSMS Tools Pack,它有很多功能,例如

Code Snippets

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

SSC +标签 - SELECT COUNT(*)FROM

SST +标签 - 选择TOP 10 * FROM

S +标签 - 选择

I + tab - INSERT

U +标签 - 更新

W +标签 - WHERE

OB +标签 - ORDER BY

然后列表继续。您可以使用SSMS工具包菜单

检查和自定义整个列表

执行日志历史记录

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

搜索数据库数据

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

格式化SQL

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

CRUD SP Generation

右键单击表格,SSMS工具 - &gt;创建CRUD以生成插入,更新,删除和选择SP。可以使用SSMS工具菜单自定义SP的内容。

其它

其他功能很少

  1. 在网格模式下搜索结果。
  2. 从结果集,表格和&amp ;;生成插入脚本数据库中。
  3. 执行计划分析器。
  4. 在多个数据库中运行一个脚本。
  5. 有关详情,请访问他们的Features页面

答案 60 :(得分: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

答案 61 :(得分:1)

半隐藏功能,表/存储过程过滤器功能非常有用......

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

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

答案 62 :(得分:0)

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

答案 63 :(得分:0)

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

答案 64 :(得分:0)

master..spt_values(特别是type ='p')对string splitting以及“binning”和time interpolation操作非常有用。

答案 65 :(得分: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。

答案 66 :(得分:0)

我使用SSMS在OS硬盘上的文件中查找文本。它使得编写正则表达式和筛选任何目录以替换或查找文本变得非常容易。我总是发现这比使用Windows更容易。

答案 67 :(得分:0)

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

spid - 与sp_who一起使用,看看谁拥有锁定。

objid - 将其与select object_name(objid)一起使用以查看锁定的数据库对象。

答案 68 :(得分:0)

替代Kolten的sp_change_users_login:

ALTER USER wacom_app WITH LOGIN = wacom_app

答案 69 :(得分:0)

使用

  

从information_schema

中选择*

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

答案 70 :(得分:0)

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

答案 71 :(得分:0)

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

改进:

  • 修剪主机名,因此复制粘贴适用于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

答案 72 :(得分: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) + '|%' 

答案 73 :(得分: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

答案 74 :(得分: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  

答案 75 :(得分:0)

一些未记录的文件在这里:Undocumented but handy SQL server Procs and DBCC commands

答案 76 :(得分: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跟踪并在“错误和警告”组中选择“阻止的进程报告”事件类。该事件的详细信息here

答案 77 :(得分:0)

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

exec sp_depends 'fn_myFunction' 

返回依赖于此函数的对象(注意,如果对象最初没有以正确的顺序运行到数据库中,则会产生不正确的结果。)

答案 78 :(得分:0)

未记录

RowNumber由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 - 分别产生文本或网格

答案 79 :(得分: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/

答案 80 :(得分:0)

我喜欢的一些东西:

在sp2中添加 - 在tools / options / scripting下的脚本选项

使用模式的新安全性 - 创建两个模式:user_access,admin_access。将您的用户procs放在一个,将admin procs放在另一个中,如下所示:user_access.showList,admin_access.deleteUser。将架构上的EXECUTE授予您的应用程序用户/角色。没有更多的GRANTING EXECUTE。

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

答案 81 :(得分:0)

强制参数化

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

Link

答案 82 :(得分:0)

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

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

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

答案 83 :(得分:0)

对于SQL Server 2005:

select * from sys.dm_os_performance_counters

select * from sys.dm_exec_requests