Category Archives: Imported from BeyondRelational

These posts are imported from my old blog page: http://beyondrelational.com/modules/2/blogs/77/nakuls-blog.aspx

#0197-SQL Server-SSMS-Disconnect all queries feature


Have you ever been in a situation wherein you have been working furiously on your SQL Server Management Studio (SSMS) on multiple query windows and you need to rush out to a meeting? As you know, each query editor window within the SSMS opens a new connection to the SQL Server. Open connections mean more resources being consumed at the server. Hence, when going into a meeting or lunch, one may not want to keep these connections open. I don’t.


So, what do I do in such cases?


The answer is simple: I use the “Disconnect all queries” feature available in the SSMS query editor right-click context menu. Here’s a short demo.


As you can see in the screen-shot below, I have 4 queries open – each connected to a different SQL server instance (to cycle through the open queries, simply use the Ctrl+TAB keyboard shortcut).


image


Now, to disconnect all queries from the corresponding SQL Server instances in one go, right-click in the query editor window, go to Connections->Disconnect all queries.


image


Upon clicking “Disconnect all Queries”, notice that the tabbed document spaces for all queries are now reading “not connected”.


image


I personally don’t like to reopen the SSMS often – it’s launched once in the morning, and the only time I close it is when I shut down my laptop in the evening.  Having a “disconnect all queries” is a cool little feature that comes in very handy.


Hope you like it as much as I do! Do you know of any cool features within SSMS? Do let me know!


Until we meet next time,


Be courteous. Drive responsibly.

#0196-SQL Server-SSMS (SQL 2012)-“Navigate To” window to easily find objects in a solution


SQL Server 2012 has been around for quite a while now, and yet, I keep finding hidden enhancements. Now, the SSMS for SQL 2012 uses the VS2010 shell and therefore inherits a lot of it’s functionalities from there. Recently, I stumbled into the “Navigate To” window in the SSMS for SQL 2012 (“Denali”).

I keep all of my scripts (which I have used in the blogs or those that I use during work) under various projects within a solution. Over time as my collection grows, it becomes difficult to remember which script is located under which project, what is the name of the script, etc. In such cases, the “Navigate To” feature can used to quickly find a file within a solution in SSMS.

Some time ago, I shared three (3) scripts related to database backups and backup history on the Scripts Module of this site, BeyondRelational.com. You can quickly access these 3 scripts using the Search Module. Recently, I had to refer one of these scripts and here’s how I used the “Navigate To” window:

With the required SSMS solution open, launch the “Navigate To” window by going to the Edit menu –> Navigate To or use the keyboard shortcut [Ctrl+ ,]

image

Type a part of the File Name in the “Navigate To” window, and it immediately gets the list of files containing the search string.

image

Double-clicking the required file opens the file from the solution in the SSMS Query editor window.

image

So simple – I was able to reach to the required script in just a matter of seconds.

To all the DBAs out there – I find storing my scripts as solutions a very easy way to manage them – I can also share the entire solution with my colleagues via the source control system. If you have not experimented with solutions, I strongly suggest that you give it a try.

Until we meet next time,

Be courteous. Drive responsibly.

#0196-SQL Server-SSMS (SQL 2012)-“Navigate To” window to easily find objects in a solution


SQL Server 2012 has been around for quite a while now, and yet, I keep finding hidden enhancements. Now, the SSMS for SQL 2012 uses the VS2010 shell and therefore inherits a lot of it’s functionalities from there. Recently, I stumbled into the “Navigate To” window in the SSMS for SQL 2012 (“Denali”).

I keep all of my scripts (which I have used in the blogs or those that I use during work) under various projects within a solution. Over time as my collection grows, it becomes difficult to remember which script is located under which project, what is the name of the script, etc. In such cases, the “Navigate To” feature can used to quickly find a file within a solution in SSMS.

Some time ago, I shared three (3) scripts related to database backups and backup history on the Scripts Module of this site, BeyondRelational.com. You can quickly access these 3 scripts using the Search Module. Recently, I had to refer one of these scripts and here’s how I used the “Navigate To” window:

With the required SSMS solution open, launch the “Navigate To” window by going to the Edit menu –> Navigate To or use the keyboard shortcut [Ctrl+ ,]

image

Type a part of the File Name in the “Navigate To” window, and it immediately gets the list of files containing the search string.

image

Double-clicking the required file opens the file from the solution in the SSMS Query editor window.

image

So simple – I was able to reach to the required script in just a matter of seconds.

To all the DBAs out there – I find storing my scripts as solutions a very easy way to manage them – I can also share the entire solution with my colleagues via the source control system. If you have not experimented with solutions, I strongly suggest that you give it a try.

Until we meet next time,

Be courteous. Drive responsibly.

#0195-SQL Server – When was the SQL Server instance restarted?


When was the SQL Server instance restarted?

Most production environments have documentation/logs and checklists maintained by a DBA that would be able to tell precisely when and why a SQL Server restart was issued. But this is not the case in development/quality assurance environments. In fact, as I was writing this post, I realized that my test instance has not been restarted since more than a month!

I was faced with this question at the office recently. One of our nightly jobs failed in quality assurance because the SQL Server service appeared to have had restarted, and we wanted to know when this had happened. I knew one method, which I used that day.

Upon further experimentation, I also found another method (using nothing but T-SQL) to determine when a SQL Server instance had restarted. Today, I will share with you both these methods:

Method 01(A): Reading the SQL Server logs through the UI

What a DBA would do in production (i.e. maintain logs) is also done by SQL Server itself. The SQL Server logs would therefore be the ideal place to go to when searching for information on when the SQL Server service restarted.

To navigate to the SQL Server logs using the SQL Server Management Studio (SSMS) UI, connect to the SQL Server instance in the Object Browser (Covered in part #2 of 10-part tutorial on SSMS), and navigate to the Management node.

Under the Management node, you will see the “SQL Server Error Logs” which would contain a set of log files (the number of log files to maintain is configurable hence; you may have more than that illustrated in the image below).

image

Double-click on the log file marked “Current”. Generally, in one of these log files, you would find an entry similar to:

SQL Server is starting at normal priority base (=7). This is an informational message only. No user action is required.

The first occurrence of this entry when going in reverse chronological order will indicate the date/time when the SQL Server was started.

image

The only case when the logs would fail to get the restart date/time is when the SQL Server has been up and running for a time long enough for the logs to have recycled over themselves.

Method 01(B): Reading the SQL Server error logs through T-SQL

In method #1A, we read the SQL Server error logs through the SQL Server UI. We can achieve the same through T-SQL also. The system stored procedure sys.sp_readerrorlog (undocumented, to the best of my knowledge) can be used to read the contents of the SQL Server error log. This system stored procedure takes up to 4 parameters:

  • Error log file to read (0 = Current, 1 = Archive #1, and so on)
  • Log File Type (NULL/1 = SQL Server Error log, 2 = SQL Agent Log)
  • String 1 (first search string)
  • String 2 (string to further refine the search)

We need to read the current file in the SQL Server Error Log, and only need to search for one string – “SQL Server is starting”. The stored procedure would therefore be:

EXEC sys.sp_readerrorlog 0, 1, 'SQL Server is starting'

The output is similar to what is shown in the graphical UI of the error log reader:

image

Method 02: Using Dynamic Management Views – sys.dm_server_services

Reading and working with error logs requires some amount of skill because they provide the user with an ocean of information – all of which is useful. For the apprentice, the error log might be a little too much to swallow and therefore, I would recommend using Dynamic Management Views (DMVs) to get to the required data. In fact, I would recommend DMVs for the experienced DBA too.

Why? They can be used in a T-SQL query just as any other table (so querying them is not a foreign concept) and they provide “real-time” information about the SQL server instance.

The DMV that provides information about the SQL Server and the SQL Server Agent services in the current instance of SQL Server is sys.dm_server_services. Along with information about service status, service account, process_id and clustered information, this DMV also provides information about when the SQL Server and the SQL Server Agent services were last started up!

SELECT * FROM sys.dm_server_services

image

Isn’t that simple? Just a single query and you have the answer to one of the most common questions of all time!

Until we meet next time,

Be courteous. Drive responsibly.

#0194-SQL Server-How to get the definition/script for a database object using T-SQL?


The moment you would have read the title of this post, you would have thought – “What’s so special in this post?” Well, did you know that there are not one, not two, but at least three (3) distinct methods that you can use to get the definition/script for any database object in Microsoft SQL Server using T-SQL?


Surprised? Read on…


Method #01 – sys.syscomments (obsolete)


For anyone who has been around since (or perhaps before) the days of SQL 2000, sys.syscomments must be familiar. This system table contains entries for each view, rule, default, trigger, CHECK constraint, DEFAULT constraint, and stored procedure within the database. Here’s how one would use it:

SELECT sc.text
FROM sys.syscomments AS sc
INNER JOIN sys.objects AS so ON sc.id = so.object_id
WHERE so.name = ‘uspUpdateEmployeePersonalInfo’
AND so.schema_id = SCHEMA_ID(‘HumanResources’)
GO

For the purposes of this demonstration, I have switched the query results output to Text and changed the max. number of characters for text output to 8000. The output is shown below:


image


System tables have already been marked for deprecation in future releases of Microsoft SQL Server. Hence, starting SQL Server 2005, it is no longer advised to use the sys.syscomments system table.


Method #02 – sp_helptext


One of the drawbacks of using sys.comments is that the formatting of the script may be lost. Another hot favourite – a system stored procedure sp_helptext, returns a fairly formatted version of the script. Here’s how to get the definition for HumanResources.uspUpdateEmployeePersonalInfo.

USE AdventureWorks2012
GO

EXEC sp_helptext ‘HumanResources.uspUpdateEmployeePersonalInfo’
GO
/*Alternate methods:
EXEC sp_helptext [HumanResources.uspUpdateEmployeePersonalInfo]
GO

–The following does not work, both the schema name and the object name need to be one identifier:
EXEC sp_helptext [HumanResources].[uspUpdateEmployeePersonalInfo]
GO
*/


The output looks like the one shown below:


image


sp_helptext continues to use the sys.syscomments system table. However, the only good thing about using a system stored procedure rather than directly querying a system table is that whenever Microsoft changes the implementation of sp_helptext, any existing scripts that use the system stored procedure would not need to change.


Method #03(A) – OBJECT_DEFINITION()


This T-SQL function returns the object data using the meta-data information associated with the specified object. Instead of worrying about using the schema name and the object name as one identifier, the usage here is much simpler because one has to deal only with the OBJECT_ID. Getting the definition of any object is as simple as executing a simple SELECT statement now:

USE AdventureWorks2012
GO
SELECT OBJECT_DEFINITION(OBJECT_ID(‘HumanResources.uspUpdateEmployeePersonalInfo’)) AS ObjectText
GO

The result is as shown below. OBJECT_DEFINITION does not query sys.syscomments, instead directly queries the metadata associated to the database.


image


sp_helptext v/s OBJECT_DEFINITION: A Comparison


Given that sys.syscomments is obsolete and should not be used, I believe it would be a good time to compare the two remaining options – sp_helptext and OBJECT_DEFINITION.



















































Object type sp_helptext OBJECT_DEFINITION
CHECK constraint Y Y
Default (or stand-alone) constraint Y Y
Default, unencrypted stored procedure Y Y
SQL Scalar functions Y Y
Rules Y Y
Replication filter procedures Y Y
Triggers Y Y
In-line TVFs Y Y
Multi-line TVFs Y Y
Views Y Y
Computed Columns Y N

All is well until the computed columns show up. OBJECT_DEFINITION clearly lags behind sp_helptext in this area.


Method #03(B) – Using sys.computed_columns


To get the definition of computed columns, a separate metadata visibility view exists, named the sys.computed_columns. Here’s a sample implementation:

USE AdventureWorks2012
GO
SELECT object_id,
name,
definition,
column_id,
system_type_id,
max_length,
precision,
scale,
collation_name
FROM sys.computed_columns
GO

The results is as shown below:


image


Now that we have seen all the 3 methods that I know of, I would like to say that my favourite one (probably out of habit) is sp_helptext. The question to you is:



Which method do you use to fetch the object definition?


Do leave a note as you go.


EDIT [09/10/2012]: My dear friend, Chintak just wrote a post extending this topic. It’s a great read and you can find it here: http://beyondrelational.com/modules/2/blogs/115/posts/17659/sphelptext-vs-objectdefinition.aspx


[END EDIT]


References



Until we meet next time,


Be courteous. Drive responsibly.