SQL Server的哪些隐藏功能?
例如,未记录的系统存储过程,做一些非常有用但没有足够文档记录的技巧?
感谢所有人的所有好评!
存储过程
片段
功能
其它
GO
重复批次后的数字答案 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 强>
答案 5 :(得分:31)
一种鲜为人知的TSQL技术,用于以随机顺序返回行:
-- Return rows in a random order
SELECT
SomeColumn
FROM
SomeTable
ORDER BY
CHECKSUM(NEWID())
答案 6 :(得分:30)
在Management Studio中,您可以通过以下方式快速获取以逗号分隔的列列:
当您不想使用通过右键单击表并选择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)
找出最热门的查询
Link 与commnad
select * from sys.dm_exec_query_stats
order by execution_count desc
答案 11 :(得分:17)
The spatial results tab can be used to create art
enter link description here http://michaeljswart.com/wp-content/uploads/2010/02/venus.png
答案 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子句中,同义词除外 对象。
sp_stored_procedures
返回存储过程列表 当前的环境。
答案 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)
<强>持久保存计算的柱强>
答案 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'
答案 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)
答案 32 :(得分:6)
如果您的脚本经常反复运行,但必须更改细节,那么在sqlcmd mode中运行ssms非常棒。 sqlcmd command line也非常漂亮。
我最喜欢的功能是:
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'ssc query“我的 服务“的”
master..xp_cmdshell'sc stop“我的 服务“的”
master..xp_cmdshell'sc start“我的 服务“的”
它非常强大,但也存在安全风险。许多人禁用它,因为它很容易被用来做服务器上的坏事。但是,如果您可以访问它,它可能非常有用。
答案 48 :(得分:2)
这是我今天学到的一个因为我需要搜索交易。
:: fn_dblog
这允许您查询数据库的事务日志。
USE mydatabase;
SELECT *
FROM ::fn_dblog(NULL, NULL)
答案 49 :(得分:2)
Sql 2000+
DBCC DROPCLEANBUFFERS
:清除缓冲区。用于在缓冲区清理时测试查询速度。
答案 50 :(得分:2)
登录事件的触发器
答案 51 :(得分:1)
可扩展的共享数据库
答案 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存储格式
答案 58 :(得分:1)
sys.database_principles中的DEFAULT_SCHEMA设置
答案 59 :(得分:1)
我想推荐一个免费的加载项SSMS Tools Pack,它有很多功能,例如
您不再需要自己键入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工具包保存所有执行历史记录,您可以根据日期或查询中的任何文本进行搜索。
此功能可帮助您搜索整个数据库中字符串的出现,并显示表名和列名以及出现的总数。您可以通过右键单击对象资源管理器中的数据库并选择“搜索数据库数据”来使用此功能。
将所有关键字设置为大写或小写字母。右键单击查询窗口并选择“设置文本格式”。您可以在SSMS工具菜单中设置快捷键。但它缺乏对齐功能。
右键单击表格,SSMS工具 - &gt;创建CRUD以生成插入,更新,删除和选择SP。可以使用SSMS工具菜单自定义SP的内容。
其他功能很少
有关详情,请访问他们的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)
我用来将此存储过程添加到主数据库
改进:
用法:
就是这样。
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)
答案 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)
强制参数化
答案 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