Skl*_*vvz 215 t-sql sql-server
SQL Server的一些隐藏功能是什么?
例如,未记录的系统存储过程,做一些非常有用但没有足够文档记录的技巧?
感谢所有人的所有伟大答案!
存储过程
片段
功能
杂项
GO重复批次后的数字Gil*_*ilM 91
在Management Studio中,您可以在GO批次结束标记之后放置一个数字,以使批次重复多次:
PRINT 'X'
GO 10
Run Code Online (Sandbox Code Playgroud)
将'X'打印10次.这样做可以避免在做重复的事情时从繁琐的复制/粘贴中解脱出来.
mar*_*c_s 70
许多SQL Server开发人员似乎仍然不了解DELETE,INSERT和UPDATE语句中的OUTPUT子句(SQL Server 2005和更新版本).
它可以知道哪些行已插入,更新或删除非常有用,并且输出子句允许这样做很容易-它允许访问称为"虚拟"的表inserted和deleted(如在触发器):
DELETE FROM (table)
OUTPUT deleted.ID, deleted.Description
WHERE (condition)
Run Code Online (Sandbox Code Playgroud)
如果要将值插入具有INT IDENTITY主键字段的表中,并使用OUTPUT子句,则可以立即获取插入的新ID:
INSERT INTO MyTable(Field1, Field2)
OUTPUT inserted.ID
VALUES (Value1, Value2)
Run Code Online (Sandbox Code Playgroud)
如果你正在更新,知道改变了什么是非常有用的 - 在这种情况下,inserted代表新值(在UPDATE之后),同时deleted引用UPDATE之前的旧值:
UPDATE (table)
SET field1 = value1, field2 = value2
OUTPUT inserted.ID, deleted.field1, inserted.field1
WHERE (condition)
Run Code Online (Sandbox Code Playgroud)
如果返回大量信息,OUTPUT的输出也可以重定向到临时表或表变量(OUTPUT INTO @myInfoTable).
非常有用 - 而且知之甚少!
渣
Mit*_*eat 52
sp_msforeachtable:使用'?'运行命令 替换为每个表名.例如
exec sp_msforeachtable "dbcc dbreindex('?')"
Run Code Online (Sandbox Code Playgroud)
您可以为每个表发出最多3个命令
exec sp_msforeachtable
@Command1 = 'print ''reindexing table ?''',
@Command2 = 'dbcc dbreindex(''?'')',
@Command3 = 'select count (*) [?] from ?'
Run Code Online (Sandbox Code Playgroud)
也, sp_MSforeachdb
Chr*_*ham 51
连接字符串附加功能:
MultipleActiveResultSets = TRUE;
这使得ADO.Net 2.0及更高版本在单个数据库连接上读取多个只进,只读结果集,如果您正在进行大量读取,则可以提高性能.即使您正在混合使用各种查询类型,也可以将其打开.
应用程序名称= MyProgramName
现在,当您想通过查询sysprocesses表查看活动连接列表时,程序的名称将显示在program_name列而不是".Net SqlClient Data Provider"中
Mit*_*eat 31
一种鲜为人知的TSQL技术,用于以随机顺序返回行:
-- Return rows in a random order
SELECT
SomeColumn
FROM
SomeTable
ORDER BY
CHECKSUM(NEWID())
Run Code Online (Sandbox Code Playgroud)
Tho*_*mas 30
在Management Studio中,您可以通过以下方式快速获取表的列的逗号分隔列表:
当您不想使用通过右键单击表并选择Script Table As ...返回时发出的令人发指的格式,这是很方便的,然后插入到...这个技巧可以与其他文件夹一起使用,因为它会给你以逗号分隔的文件夹中包含的名称列表.
Rob*_*oek 23
行构造函数
您可以使用单个insert语句插入多行数据.
INSERT INTO Colors (id, Color)
VALUES (1, 'Red'),
(2, 'Blue'),
(3, 'Green'),
(4, 'Yellow')
Run Code Online (Sandbox Code Playgroud)
Skl*_*vvz 20
找出最受欢迎的查询
与commnad 链接
select * from sys.dm_exec_query_stats
order by execution_count desc
Run Code Online (Sandbox Code Playgroud)
Mar*_*ith 17
在此处输入链接描述http://michaeljswart.com/wp-content/uploads/2010/02/venus.png
Kol*_*ten 16
在为测试目的或其他目的还原数据库时非常有用.正确重新映射登录ID:
EXEC sp_change_users_login 'Auto_Fix', 'Mary', NULL, 'B3r12-36'
Run Code Online (Sandbox Code Playgroud)
Ray*_*ega 16
这两个关键字不是编写复杂的连接和子查询,而是在比较两个查询结果时表达查询意图的更优雅的简写和可读方式.从SQL Server 2005开始,它们强有力地补充了多年来已经存在于TSQL语言中的UNION.
EXCEPT,INTERSECT和UNION的概念是集合论的基础,它是所有现代RDBMS使用的关系建模的基础和基础.现在,使用TSQL可以更直观地生成维恩图类型结果.
Gat*_*ler 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
Run Code Online (Sandbox Code Playgroud)
Gat*_*ler 15
表格校验和
Select CheckSum_Agg(Binary_CheckSum(*)) From Table With (NOLOCK)
Run Code Online (Sandbox Code Playgroud)
行校验和
Select CheckSum_Agg(Binary_CheckSum(*)) From Table With (NOLOCK) Where Column = Value
Run Code Online (Sandbox Code Playgroud)
小智 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
Run Code Online (Sandbox Code Playgroud)
结果:
Acme, Microsoft, Apple,
Run Code Online (Sandbox Code Playgroud)
Edu*_*eni 14
如果您想要存储过程的代码,您可以:
sp_helptext 'ProcedureName'
Run Code Online (Sandbox Code Playgroud)
(不确定它是否是隐藏功能,但我一直使用它)
edo*_*aur 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
Run Code Online (Sandbox Code Playgroud)
Bin*_*ony 12
在SQL Server 2005/2008中显示SELECT查询结果中的行号:
SELECT ( ROW_NUMBER() OVER (ORDER BY OrderId) ) AS RowNumber,
GrandTotal, CustomerId, PurchaseDate
FROM Orders
Run Code Online (Sandbox Code Playgroud)
ORDER BY是强制性条款.OVER()子句告诉SQL引擎对指定列(在本例中为OrderId)中的数据进行排序,并根据排序结果分配数字.
Skl*_*vvz 10
用于解析存储过程参数:xp_sscanf
将字符串中的数据读入每个format参数指定的参数位置.
以下示例使用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
Run Code Online (Sandbox Code Playgroud)
这是结果集.
-------------------- --------------------
products10.tmp random
Run Code Online (Sandbox Code Playgroud)
仅限退货日期
Select Cast(Floor(Cast(Getdate() As Float))As Datetime)
Run Code Online (Sandbox Code Playgroud)
要么
Select DateAdd(Day, 0, DateDiff(Day, 0, Getdate()))
Run Code Online (Sandbox Code Playgroud)
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')
Run Code Online (Sandbox Code Playgroud)
代码来自:http://blog.sqlauthority.com/2009/05/09/sql-server-find-last-date-time-updated-for-any-table/
引用的信息: SQL Server - 表的最后一行插入行的日期/时间是什么?
在SQL 2005及更高版本中可用
以下是我觉得有用的一些功能,但很多人似乎并不了解:
sp_tables
Run Code Online (Sandbox Code Playgroud)
返回可在当前环境中查询的对象列表.这意味着可以出现在FROM子句中的任何对象,但同义词对象除外.
sp_stored_procedures
Run Code Online (Sandbox Code Playgroud)
返回当前环境中的存储过程列表.
查找日期在当前周内某处的记录.
where dateadd( week, datediff( week, 0, TransDate ), 0 ) =
dateadd( week, datediff( week, 0, getdate() ), 0 )
Run Code Online (Sandbox Code Playgroud)
查找上周发生的日期记录.
where dateadd( week, datediff( week, 0, TransDate ), 0 ) =
dateadd( week, datediff( week, 0, getdate() ) - 1, 0 )
Run Code Online (Sandbox Code Playgroud)
返回当前周开始的日期.
select dateadd( week, datediff( week, 0, getdate() ), 0 )
Run Code Online (Sandbox Code Playgroud)
返回上周开始的日期.
select dateadd( week, datediff( week, 0, getdate() ) - 1, 0 )
Run Code Online (Sandbox Code Playgroud)
小智 7
不是隐藏功能,而是在Tools\Options\Keyboard下的Management Studio中设置键映射:Alt + F1默认为sp_help"选定文本"但是如果没有为sp_helptext添加Ctrl + F1"选定文本"我就无法生存
有时候没有合适的列可以排序,或者您只想在表上使用默认排序顺序,并且您想要枚举每一行.为了做到这一点,你可以在"order by"子句中加上"(select 1)",你就可以得到你想要的东西.干净,嗯?
select row_number() over (order by (select 1)), * from dbo.Table as t
Run Code Online (Sandbox Code Playgroud)
小智 6
/*查找具有最大可用空间的固定驱动器,您还可以复制文件以估计哪个磁盘最快*/
EXEC master..xp_fixeddrives
Run Code Online (Sandbox Code Playgroud)
/*在使用或参考之前检查有关文件的假设*/
EXEC master..xp_fileexist 'C:\file_you_want_to_check'
Run Code Online (Sandbox Code Playgroud)
本周我学到的最令人惊讶的事情是在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
Run Code Online (Sandbox Code Playgroud)
如果您已经反复运行脚本,但必须更改细节,那么在sqlcmd模式下运行ssms 非常棒.该SQLCMD命令行是很漂亮了.
我最喜欢的功能是:
不再滔滔不绝,Red Gate的Simpletalk做了一个很棒的sqlcmd - SQLCMD Workbench.Donabel Santos也有一些很棒的SQLCMD例子.
这是我写的一个查询,按上次修改日期列出所有数据库用户对象:
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
55677 次 |
| 最近记录: |