It’s Meme Monday time! Our topic is SQL Horoscopes, or more catchily, SQLStrology.
We’re going to have to figure out what astrological sign our SQL Server instance has – when it was “born” (installed) – before we can apply any kind of horoscope predictions. I’ll start with the base query to find the installation date:
SELECT createdate as Sql_Server_Install_Date
FROM sys.syslogins
where sid = 0x010100000000000512000000 -- language neutral
-- loginname = 'NT AUTHORITY\SYSTEM' -- only English language installations(Thanks to Mladen P for the SQL Server install date query.)
Now let’s turn this into a function we can use on any SQL Server instance. There are several different ways to code this function; I chose to go with a table variable return, and a table variable to hold the Zodiac fields; I could just have easily accomplished this with a CASE statement to populate the return table, but I think readability would suffer:
CREATE FUNCTION dbo.GetServerHoroscope()
RETURNS @ServerHoroscope TABLE (
ServerName NVARCHAR(200),
SqlServerInstallDate DATE,
ZodiacSign NVARCHAR(20),
QuickCharacteristics NVARCHAR(400))
AS
/*=============================================
Author: Jennifer McCown Jen@MidnightDBA.com http://www.MidnightDBA.com/Jen/
Create date: 7/11/2011
Copyright:
This work by Jennifer McCown is licensed under a Creative Commons
Attribution-Noncommercial-No Derivative Works 3.0 United States License.
http://creativecommons.org/licenses/by-nc-nd/3.0/us/
(Which means, use it all you want, break it up, whatever...as long as you
attribute me.)
-------------------------
Description:
This function uses the SQL Server installation date to determine the installation's
zodiac sign, and also returns quick astrological characteristics.
-------------------------
Example execution:
SELECT * FROM dbo.GetServerHoroscope();
=============================================*/BEGIN
-----------------------
-- DECLARE VARIABLES --
-----------------------
DECLARE @SqlServerInstallDate DATE;
DECLARE @SQLStrology TABLE (
ZodiacSign NVARCHAR(20),
START NVARCHAR(20),
[END] NVARCHAR(20),
StartDate DATE,
EndDate DATE,
QuickCharacteristics NVARCHAR(400));
------------------------
-- POPULATE VARIABLES --
------------------------
/* Thanks to Mladen Pradjic for this SQLServerInstallDate query. See
http://weblogs.sqlteam.com/mladenp/archive/2009/07/16/How-to-check-when-was-SQL-Server-installed-with-a.aspx
*/ SELECT @SqlServerInstallDate = createdate
FROM sys.syslogins
WHERE sid = 0x010100000000000512000000 -- language neutral
-- loginname ='NT AUTHORITY\SYSTEM' -- only English language installations
/* Zodiac dates and characteristics pulled from http://www.whats-your-sign.com/zodiac-sign-dates.html */ INSERT INTO @SQLStrology (ZodiacSign,START, [END], QuickCharacteristics)
VALUES ('Aries', '03/21', '04/9', 'Active, Demanding, Determined, Effective, Ambitious'),
('Taurus', '04/20', '05/20', 'Security, Subtle strength, Appreciation, Instruction, Patience'),
('Gemini', '05/21', '06/20', 'Communication, Indecision, Inquisitive, Intelligent, Changeable'),
('Cancer', '06/21', '07/22', 'Emotion, Diplomatic, Intensity, Impulsive, Selective'),
('Leo', '07/23', '08/22', 'Ruling, Warmth, Generosity, Faithful, Initiative'),
('Virgo', '08/23', '09/22', 'Analyzing, Practical, Reflective, Observation, Thoughtful'),
('Libra', '09/23', '10/22', 'Balance, Justice, Truth, Beauty, Perfection'),
('Scorpio', '10/23', '11/21', 'Transient, Self-Willed, Purposeful, Unyielding'),
('Sagittarius', '11/22', '12/21', 'Philosophical, Motion, Experimentation, Optimism'),
('Capricorn', '12/22', '01/19', 'Determination, Dominance, Perservering, Practical, Willful'),
('Aquarius', '01/20', '02/18', 'Knowledge, Humanitarian, Serious, Insightful, Duplicitous'),
('Pisces', '02/19', '03/20', 'Fluctuation, Depth, Imagination, Reactive, Indecisive');
-- Use the NVARCHAR start and end date strings and the SQL Server install date to build actual zodiac dates:
UPDATE @SQLStrology SET StartDate = CAST(START + '/'+ CAST(YEAR(@SqlServerInstallDate) AS CHAR(4)) AS DATE),
EndDate = CAST([END] + '/'+ CAST(YEAR(@SqlServerInstallDate) AS CHAR(4)) AS DATE);
-- Insert the one applicable row into the output table:
INSERT INTO @ServerHoroscope
SELECT @@ServerName as ServerName
, @SqlServerInstallDate AS SqlServerInstallDate
, ZodiacSign
, QuickCharacteristics
FROM @SQLStrology
WHERE @SqlServerInstallDate BETWEEN StartDate AND EndDate;
------------
-- RETURN --
------------
RETURN;
ENDThis was a fun exercise. For more on multi-statement table-valued functions, see the SQL Server Books Online article CREATE FUNCTION, especially example C.
I look forward to updating the function with your SQL-specific SQLstrology characteristics.
Happy days,
Jen McCown