brainbaking/content/wiki/code/db/mssql.md

7.6 KiB

+++ title = "mssql" draft = false tags = [ "", "Users", "jefklak", "Downloads", "pages", "code", "db", "mssql" ] date = "2016-05-24" +++

MSSQL

clustered indexen aanpassen door ze eerst te resolven in een cursor

Onderstaand stukje code for future reference...

DECLARE @constraint NVARCHAR(MAX)
DECLARE @cmd NVARCHAR(MAX)
DECLARE @table NVARCHAR(MAX)

DECLARE FKCURSOR CURSOR FOR 
select distinct name,object_name(parent_object_id) from sys.objects where object_id in 
(   select fk.constraint_object_id from sys.foreign_key_columns as fk
    where fk.referenced_object_id = 
    	(select object_id from sys.tables where name = 'Reference')
)

OPEN FKCURSOR

FETCH NEXT FROM FKCURSOR 
INTO @constraint, @table

WHILE @@FETCH_STATUS = 0
BEGIN

	SET @cmd = N'ALTER TABLE [dbo].['+@table+'] DROP CONSTRAINT ' +  @constraint
	EXEC sp_executeSQL @cmd;

   FETCH NEXT FROM FKCURSOR 
    INTO @constraint, @table
END 
CLOSE FKCURSOR;
DEALLOCATE FKCURSOR;

constraints met auto-names verwijderen als een kolom hierop depent

Gebruik information schemes om de data hier uit te halen.

Bvb onderstaande code verwijdert de kolom 'isDefault', nadat alle constraints hierrond verwijderd zijn.

declare @cname varchar(100)
declare @query nvarchar(max)
set @cname = (

SELECT
    default_constraints.name
FROM 
    sys.all_columns

        INNER JOIN
    sys.tables
        ON all_columns.object_id = tables.object_id

        INNER JOIN 
    sys.schemas
        ON tables.schema_id = schemas.schema_id

        INNER JOIN
    sys.default_constraints
        ON all_columns.default_object_id = default_constraints.object_id

WHERE 
        schemas.name = 'dbo'
    AND tables.name = 'tblhtmltemplate'
    AND all_columns.name = 'isdefault')

	set @query = 'alter table tblhtmltemplate drop constraint ' + @cname 

if @cname is not null begin
	exec sp_executesql @query
end

IF  EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name######'tblHtmlTemplate' AND column_name 'isDefault')
BEGIN
	alter table tblhtmltemplate drop column isdefault;
END;

functies aanmaken om MySQL syntax te mimicken

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE FUNCTION ifnull 
(
	-- Add the parameters for the function here
	@value1 datetime, @returnvalue int
)
RETURNS datetime
AS
BEGIN
	return isnull(@value1, @returnvalue)

END
GO

Zou IFNull moeten mimicken, maar je kan enkel select dbo.ifnull() doen ipv de native syntax...

Waar zijn de DB files op de schijf ergens geplaatst?

SELECT name, physical_name AS current_file_location
FROM sys.master_files

Zie ook MSDN: MSSQL DB file locations

Alter databases gaan traag

  1. uitvoeren met WITH ROLLBACK IMMEDIATE;
  2. uitvoeren in SINGLE_USER mode (set op db niveau, dan terug naar MULTI_USER zetten)

Query notifications

Service broker aan zetten: ALTER DATABASE db_name SET ENABLE_BROKER with rollback immediate

Hoe checken of reeds enabled is? select name, database_id, service_broker_guid from sys.databases where is_broker_enabled = 1;

service broker GUIDs zijn dezelfde indien DB gekopiëerd is, bijgevolg krijg je deze fout indien je ENABLE_BROKER tracht uit te voeren op zo'n kopie:

cannot be enabled because there is already an enabled Service Broker with the same ID

Fix: (bron) maak een nieuwe broker GUID aan met SET NEW_BROKER.

In combinatie met NHibernate Syscache2

Zie

Hoe weet ik nu of notification works?

We moeten zien of de Broker:Conversation berichten correct op- en afgestuurd worden. Dit kan je best nagaan in SQL Server Profiler:

Volgende dingen zouden moeten gebeuren:

  1. STARTED_OUTBOUND bericht (conversation)
  2. CONVERSING bericht (conversation) van .Net SqlClient applicationName
  3. QN:Subscription van .Net SqlClient applicationName
  4. QN:Dynamics event subclass Clock run om te zien of het event gequeued is.

Pitfalls en errors

System.InvalidOperationException: When using SqlDependency without providing an options value, SqlDependency.Start() must be called prior to execution of a command added to the SqlDependency instance.

Bron

SqlDependency.Start(conString) aanroepen vóór de setup van bvb de NHibernate session factory. Dit moet je zelf doen, ook al gebruik je SysCache2 met regions.

altijd eerst Stop aanroepen!

Cannot execute as the database principal because the principal "dbo" does not exist

In SQL Server profiler zichtbaar bij broker events - dit komt vanwege te weinig rechten.

use [DBNAME] EXEC sp_changedbowner 'sa' lost dit probleem op (zie profiling)

MSSQL specifieke syntax

Batch processing

GO:

The GO command isn't a Transact-SQL statement, but a special command recognized by several MS utilities including SQL Server Management Studio code editor.

The GO command is used to group SQL commands into batches which are sent to the server together. The commands included in the batch, that is, the set of commands since the last GO command or the start of the session, must be logically consistent. For example, you can't define a variable in one batch and then use it in another since the scope of the variable is limited to the batch in which it's defined.

Zie ook http:*msdn.microsoft.com/en-us/library/ms188037.aspx.

Dit is blijkbaar ook wijzigbaar naar een karakterset naar keuze in Management studio options:

Rename columns
EXEC sp_RENAME 'TableName.OldColumnName' , 'NewColumnName', 'COLUMN'
werken met datums

GETDATE() is een now timestamp (in MySQL is dit CURDATE(). Records selecteren met een bepaalde timestamp ("vanaf"):

select * from table where datecolumn >= Convert(datetime, '2014-09-11');

In Oracle is dit bijvoorbeeld TO_DATE('26/JAN/2011','dd/mon/yyyy') in plaats van Convert() - in MySQL kan dit rechtstreeks in een bepaald formaat: WHERE start_date >'2012-11-18';

Monitoring

ADO .NET Connection pool monitoring

Mogelijk met Performance monitor in Win32 (Run -> perfmon).

Step-by-step uitleg: (oude versie) Monitoring DB connections using performance counters

Mogelijke counters - MSDN:

  1. NumberOfActiveConnections
  2. NumberOfFreeConnections
  3. NumberOfPooledConnections
  4. ...

Alles ivm DB connecties in .NET is ook mogelijk te bekijken met de ANTS Performance profiler.

Aantal momenteel actieve threads bezien
SELECT 
    DB_NAME(dbid) as DBName, 
    COUNT(dbid) as NumberOfConnections,
    loginame as LoginName
FROM
    sys.sysprocesses
WHERE 
    dbid > 0
GROUP BY 
    dbid, loginame