惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

D
Darknet – Hacking Tools, Hacker News & Cyber Security
Jina AI
Jina AI
博客园_首页
J
Java Code Geeks
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 司徒正美
Hugging Face - Blog
Hugging Face - Blog
S
SegmentFault 最新的问题
MyScale Blog
MyScale Blog
P
Proofpoint News Feed
L
Lohrmann on Cybersecurity
Forbes - Security
Forbes - Security
大猫的无限游戏
大猫的无限游戏
Vercel News
Vercel News
Y
Y Combinator Blog
Google DeepMind News
Google DeepMind News
The Register - Security
The Register - Security
N
News | PayPal Newsroom
S
Security Archives - TechRepublic
量子位
Cisco Talos Blog
Cisco Talos Blog
V
V2EX
C
Cisco Blogs
The Cloudflare Blog
Stack Overflow Blog
Stack Overflow Blog
L
LangChain Blog
Scott Helme
Scott Helme
S
Securelist
Security Latest
Security Latest
爱范儿
爱范儿
TaoSecurity Blog
TaoSecurity Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
I
Intezer
L
LINUX DO - 最新话题
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
C
Check Point Blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
美团技术团队
Know Your Adversary
Know Your Adversary
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
PCI Perspectives
PCI Perspectives
月光博客
月光博客
T
Tailwind CSS Blog
Cloudbric
Cloudbric
小众软件
小众软件
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
K
Kaspersky official blog
D
DataBreaches.Net
博客园 - 【当耐特】
有赞技术团队
有赞技术团队

博客园 - 电机拖动

我晕,DELL邮寄WIN7升级光盘的服务是不是太过分了? 史记.饭岛爱列传(转) [翻译]JavaScript性能测试 如果《24》在94年播出的话…… 两个当年的MS广告(暴笑) SQL Server中的两个有用的存储过程 重新回归 [翻译]Scott Mitchell 的ASP.NET 2.0数据教程之四十九:使用SqlDataSource插入、更新以及删除数据 [翻译]Scott Mitchell 的ASP.NET 2.0数据教程之四十八:在SqlDataSource中使用参数化查询 - 电机拖动 [翻译]Scott Mitchell 的ASP.NET 2.0数据教程之四十七:使用SqlDataSource控件查询数据 [翻译]Scott Mitchell的ASP.NET2.0数据教程中文版索引(Canceled!!) Evanescence - Origin [翻译]Scott Mitchell 的ASP.NET 2.0数据教程之十五:在GridView的页脚中显示统计信息 [翻译]Scott Mitchell 的ASP.NET 2.0数据教程之十四:使用FormView 的模板 [翻译]Scott Mitchell 的ASP.NET 2.0数据教程之十三:在DetailsView控件中使用TemplateField [翻译]Scott Mitchell 的ASP.NET 2.0数据教程之十二:在GridView控件中使用TemplateField [翻译]Scott Mitchell 的ASP.NET 2.0数据教程之二:创建一个业务逻辑层 [SQLServer2000]TEMPDB丢失或TEMPDB文件损坏的服务器恢复 白话设计模式——FactoryMethod
新手可以借助Profiler学习TSQL
电机拖动 · 2008-03-31 · via 博客园 - 电机拖动

记得当年有人问我应该如何学习SQL(这里主要是说T-SQL,以下均用SQL代之),我的回答是看MS给的那个联机丛书,不说别的,先看了那些语法再说。看完之后,自然会有许多的收获。比如,有人认为自己SQL语句写得很不错了,可是连Left JoinRight Join都不知道,认为“反正差不多,没关系”,甚至认为Right Join是一种Inner Join……又有人认为SELECT语句不过如此而已,然而连HAVING都不知道是干什么的……

如此种种,自然是看看联机丛书中的Syntax会比较好,然后再看看Level更高一些的文章(都是联机丛书中的)。

后来发现,光看那个联机丛书的话,可能会有很大的挫折感,因为内容太多,而且又比较乱(相对的),也就不知道要看到何年何月才能到头了……因此,我给各位新手们介绍一下我最早的时候是如何学习SQL的,不过为了与时俱进,这里我以SQLServer2005为例。实际上,我当年也是有上述感觉的,总觉得这内容是不是也太多了,好像完全不着边际一样,后来我就在一个师兄的介绍下,使用了Profiler来查看我们在企业管理器(2005以后就叫SQL Server Management Studio了)中所做的操作的SQL语句,效果非常不错。其实,原因很简单,你每天就用Profiler找那么几条SQL语句出来,然后看看里面有没有自己不明白的,然后就查联机丛书,这样,每天学的东西不用很多,但是每天都有新的成就感出现,自然而然的也就有兴趣继续学下去了。

好了,我们来看看具体的步骤。

首先,打开Profiler(在SQL Server Management Studio中)。

 


然后新建一个跟踪(文件
-->新建跟踪)

填入数据库登陆信息后会弹出当前跟踪的一个属性设置窗口。

 


到第二个标签页点“列选择器”

 


在下图所示的位置填上“
Microsoft SQL Server Management Studio

 


然后点“确定”再点“运行”,
OK,可以了。

现在到SQL Server Management Studio中打开一个数据库,选中其一个表,再点开这个表的“Columns”文件夹。之后,再看看Profiler窗口中的结果。

 


好了,随便找一条来看,把代码
COPY出来。

 1SELECT   clmns.name AS [Name],
 2         'Server[@Name=' + QUOTENAME(CAST(SERVERPROPERTY(N'Servername'AS SYSNAME), ''''+ 
 3             ']' + '/Database[@Name=' + QUOTENAME(DB_NAME(),''''+ ']' + '/Table[@Name=' + 
 4             QUOTENAME(tbl.name,''''+ ' and @Schema=' + QUOTENAME(SCHEMA_NAME(tbl.schema_id),''''+ 
 5             ']' + '/Column[@Name=' + QUOTENAME(clmns.name,''''+ ']' AS [Urn],
 6         CAST(ISNULL(cik.index_column_id,0AS BITAS [InPrimaryKey],
 7         CAST(ISNULL((SELECT TOP 1  1
 8                      FROM   sys.foreign_key_columns AS colfk
 9                      WHERE  colfk.parent_column_id = clmns.column_id
10                      AND colfk.parent_object_id = clmns.object_id),
11                     0AS BITAS [IsForeignKey],
12         usrt.name AS [DataType],
13         ISNULL(baset.name,N''AS [SystemType],
14         CAST(CASE 
15                WHEN baset.name IN (N'nchar',
16                                    N'nvarchar')
17                     AND clmns.max_length <> - 1 THEN clmns.max_length / 2
18                ELSE clmns.max_length
19              END AS INTAS [Length],
20         CAST(clmns.PRECISION AS INTAS [NumericPrecision],
21         CAST(clmns.scale AS INTAS [NumericScale],
22         clmns.is_nullable AS [Nullable],
23         clmns.is_computed AS [Computed],
24         ISNULL(s2clmns.name,N''AS [XmlSchemaNamespaceSchema],
25         ISNULL(xscclmns.name,N''AS [XmlSchemaNamespace],
26         ISNULL((CASE clmns.is_xml_document 
27                   WHEN 1 THEN 2
28                   ELSE 1
29                 END),0AS [XmlDocumentConstraint]
30FROM     sys.tables AS tbl
31         INNER JOIN sys.all_columns AS clmns
32           ON clmns.object_id = tbl.object_id
33         LEFT OUTER JOIN sys.indexes AS ik
34           ON ik.object_id = clmns.object_id
35              AND 1 = ik.is_primary_key
36         LEFT OUTER JOIN sys.index_columns AS cik
37           ON cik.index_id = ik.index_id
38              AND cik.column_id = clmns.column_id
39              AND cik.object_id = clmns.object_id
40              AND 0 = cik.is_included_column
41         LEFT OUTER JOIN sys.types AS usrt
42           ON usrt.user_type_id = clmns.user_type_id
43         LEFT OUTER JOIN sys.types AS baset
44           ON baset.user_type_id = clmns.system_type_id
45              AND baset.user_type_id = baset.system_type_id
46         LEFT OUTER JOIN sys.xml_schema_collections AS xscclmns
47           ON xscclmns.xml_collection_id = clmns.xml_collection_id
48         LEFT OUTER JOIN sys.schemas AS s2clmns
49           ON s2clmns.schema_id = xscclmns.schema_id
50WHERE    (tbl.name = N'EmployeeDepartmentHistory'
51   AND SCHEMA_NAME(tbl.schema_id) = N'HumanResources')
52ORDER BY clmns.column_id ASC


就这么几个简单的操作,我们可以发现好多的问题。比如:

1.  Profiler中,我实在记不得Management Studio的全名了,该怎么办?

2.  字符串前面的N是干什么的?

3.  SELECT TOP 1是什么意思?

4.  SELECT TOP 1 1又是什么意思?是11吗?那去掉两个1中间的空格试试看?

5.  CASE clmns.is_xml_document WHEN 1 THEN 2 ELSE 1 END 如果写成 CASE WHEN clmns.is_xml_document = 1 THEN 2 ELSE 1 END 有什么区别吗?

诸如此类,就这一个操作,你可能会发现许多自己所不知道的,或是平常没有注意的东西。

另外,这个Profiler的目的可不仅仅是为了帮你学习SQL语句这么简单,它本来的目的是为了帮助你了解SQL Server的运行情况的,这对于进行数据库性能优化来说是非常有帮助的。而且,如果你在某个组织的IT部门工作,而同一个服务器(或者说SQL Server实例)上运行着多个数据库,那么你还可以根据得到的一些数据来判断哪个数据库需要特别照顾^_^