Posts Tagged ‘T-SQL’

Restored database konflikter med et opdaterings deploy fra VS DB Ed.

Jeg løb ind i et lidt filøjerligt issue her til aftens da jeg skulle lave et opdateringsdeploy fra VS ud til min dev instans af en database.
Jeg havde modtaget en backup fra en kollega, der indeholdt en masse testdata, som jeg restorede ind og overskrev den eksisterende instans jeg havde på min maskine.
Efterfølgende fik jeg kørt en del af de tests jeg skulle, men undervejs kom der opdateringer til skemaet. Da jeg så ville opdatere min instans modtog jeg følgende besked fra VS:

The database owner SID recorded in the master database differs from the database owner SID recorded in database…

For at gøre en lang historie kort googlede jeg en løsning, og for at jeg ikke selv skal glemme den så let, poster jeg den her:
use mydb
go
EXEC dbo.sp_changedbowner @loginame = N’sa’, @map = false

Reklamer

Julian Date og supplementsmånede

Jeg sad og skimmede nettet for smarte tricks til en tidsdimension i et datawarehouse.
Jeg faldt over følgende indlæg: http://dylanwan.wordpress.com/data-warehouse-design/design-tip-1-key-for-the-date-dimension/ og fandt det egentlig meget interessant, lige indtil jeg stødte ind i kravet: supplementsmånede. Jeg kan ikke rigtig se, at man kan løse dette krav med en konvertering af date til julian hvor man samtidig håndterer den 13. månede eller?

Find tekst i Stored Procedure

Var på jagt efter en kolonne der var blevet omdøbt. En sådan fætter findes på følgende måde

SELECT sysobjects.name
FROM syscomments INNER JOIN sysobjects ON sysobjects.ID = syscomments.id
WHERE sysobjects.type = ‘P’ AND syscomments.text LIKE ‘%<søge tekst>%’

CTE – Common Table Expressions Issue

Rendte ind i et mindre, ikke så vel dokumenteret, problem i dag da jeg ville anvende Common Table Expressions (CTE) i et T-SQL testscript.

Min konstruktion var som følger:

DECLARE @Count AS INT 
WITH
EmployeesWithSameBirthDate ( ID, [Count] ) AS
(
SELECT
dbo.HumanResources.Employee.EmployeeID
, COUNT( dbo.HumanResources.Employee.BirthDate ) AS [Count]
FROM dbo.HumanResources.Employee 
GROUP BY dbo.HumanResources.Employee.EmployeeID 
HAVING COUNT( dbo.HumanResources.Employee.BirthDate ) > 1
)

SET
@Count = ( SELECT COUNT( 0 ) FROM EmployeesWithSameBirthDate )
IF ( @Count > 0 )
BEGIN
–Bla bla bla
END
ELSE
BEGIN
–Bla bla bla
END

Problemet er, at man kun kan kalde CRUD’s direkte efter CTE’en er oprettet, og dermed ikke ‘SET @Count = …’

Løsningen i denne situation er at erstatte linien hvor @Count bliver assignet med følgende statement:

SELECT @Count  = COUNT( 0 ) FROM EmployeesWithSameBirthDate

HierarchyID datatypen

Denne nye datatype introduceres med SQL Server 2008 og må siges at være en længe savnet type. I hverfald har jeg tidligere kunne have haft brug for en sådanne mulighed.

Læs mere her

Kør SQL statement mod alle databaser

Der findes en udokumenteret system stored procedure fra Microsoft, der gør det muligt at eksekvere en T-SQL sætning mod alle databaser. Uden at skulle sætte en cursor op mod sysdatabases tabellen.

Syntax:
EXEC sp_MSforeachdb @command
(hvor @command er en streng af variabel længde)

Eksempel:
Dette eksempel returnerer en liste med alle tabeller i alle datasbase på en given SQL-Server instans
DECLARE @command varchar(1000)
SELECT @command = ‘USE ? SELECT name FROM sysobjects WHERE xtype = ”U” ORDER BY name’
EXEC sp_MSforeachdb @command

Se i øvrigt:
http://www.mssqltips.com/tip.asp?tip=1414