Kashiash's Blog

o programowaniu inaczej : jak zrobić i się nie narobić

Archive for the ‘SQL’ Category

Go(lang) I MS SQL

Posted by kashiash w dniu 18 grudnia, 2017

Dzisiaj połaczymy sie aplikacja w go z MS SQL.

Trzeba pobrać driver sql


go get github.com/denisenkom/go-mssqldb

przykład, który pobiera dane z tabeli:

package main
import (
    "database/sql"
    "fmt"
    "log"
    _ "github.com/denisenkom/go-mssqldb"
)
func main() {
    condb, errdb := sql.Open("mssql", "server=192.168.1.1;user id=jk;password=JakiesDzwineHaslo;database=baza1")
    if errdb != nil {
        fmt.Println(" Error open db:", errdb.Error())
    }
    var (
        id int
        NrKlienta int
        Nazwa string
    )
    rows, err := condb.Query("select ID,IDKLIENTA,NAZWA from dbo.Klienci")
    if err != nil {
        log.Fatal(err)
    }
    for rows.Next() {
        err := rows.Scan(&id, &NrKlienta, &Nazwa)
        if err != nil {
            log.Fatal(err)
        }
        log.Println(id, NrKlienta, Nazwa)
    }
    defer condb.Close()
}

powyższy kod pobiera 3 wybrane kolumny z tabeli klienci i wyświetla je na oknie konsoli.
Następnym razem wrzucimy to do excela 😉
Gdybysmy chcieli wykonać jakąś komendę nie będąca zapytaniem sql można użyć metody Exec:

   _, err = condb.Exec("update klienci set Uwagi = 'ABC' where Data is not null")

Posted in Go, SQL, Uncategorized | Leave a Comment »

Różnica wydajności zapytań SQL

Posted by kashiash w dniu 6 czerwca, 2010

Na stronie Pinala pojawiło sie ciekawe porównanie czasu wykonania zapytań sql które daja ten sam efekt tylko nieco inaczej są utworzone:

USE AdventureWorks
GO
-- use of =
SELECT *
FROM HumanResources.Employee E
WHERE E.EmployeeID = ( SELECT EA.EmployeeID
FROM HumanResources.EmployeeAddress EA
WHERE EA.EmployeeID = E.EmployeeID)
GO
-- use of in
SELECT *
FROM HumanResources.Employee E
WHERE E.EmployeeID IN ( SELECT EA.EmployeeID
FROM HumanResources.EmployeeAddress EA
WHERE EA.EmployeeID = E.EmployeeID)
GO
-- use of exists
SELECT *
FROM HumanResources.Employee E
WHERE EXISTS ( SELECT EA.EmployeeID
FROM HumanResources.EmployeeAddress EA
WHERE EA.EmployeeID = E.EmployeeID)
GO
-- Use of Join
SELECT *
FROM HumanResources.Employee E
INNER JOIN HumanResources.EmployeeAddress EA ON E.EmployeeID =EA.EmployeeID
GO

link do oryginalnego artykułu na Journey to SQL Authority with Pinal Dave

Posted in SQL | Leave a Comment »

Postać normalna bazy danych

Posted by kashiash w dniu 5 czerwca, 2010

W internecie można znaleźć informacje na temat postaci normalnych w wielu miejscach. Ja znalazłem w formie plakatu. Ważne jest to, że postacie normalne powinny być stosowane ale nie bezmyślnie i bezwzględnie. Niekiedy delikatne odstępstwo sie przydaje. Reguły niestety nie mam … robię to intuicyjnie, po prostu jak normalizacja ci bardzo przeszkadza w pisaniu programu to zrób mały wyjątek. Jak projektujesz bazę projektuj bez wyjątków. Łatwiej jest baze zdenormalizować niż normalizować

Arkusz o normalizacji: rettigNormalizationPoster

Ściąga z SQL SQLServerCheatSheet

Struktura tabel technicznych SQL’a 2008: SQL-SERVER-2008-System-Views-Poster

Posted in Dobre praktyki, SQL | Leave a Comment »

20 najwolniejszych (najdłużej wykonujących się) zapytań SQL

Posted by kashiash w dniu 2 czerwca, 2010

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

SELECT TOP 20
CAST(total_elapsed_time / 1000000.0 AS DECIMAL(28, 2)) #A
AS [Total Elapsed Duration (s)]
, execution_count
, SUBSTRING (qt.text,(qs.statement_start_offset/2) + 1, #B
((CASE WHEN qs.statement_end_offset = -1
THEN LEN(CONVERT(NVARCHAR(MAX), qt.text)) * 2
ELSE
qs.statement_end_offset
END - qs.statement_start_offset)/2) + 1) AS [Individual Query]
, qt.text AS [Parent Query]
, DB_NAME(qt.dbid) AS DatabaseName
, qp.query_plan
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) as qt
CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) qp
INNER JOIN sys.dm_exec_cached_plans as cp
on qs.plan_handle=cp.plan_handle
ORDER BY total_elapsed_time DESC

Posted in SQL | Leave a Comment »

Jak wykryć LOCK w MS SQL Serwer

Posted by kashiash w dniu 2 czerwca, 2010

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

PRINT GETDATE()
EXEC master.dbo.dba_BlockTracer
IF @@ROWCOUNT > 0
BEGIN
SELECT GETDATE() AS TIME
EXEC master.dbo.dba_WhatSQLIsRunning
END
WAITFOR DELAY '00:00:15'
GO 500

potrzebujemy do tego 3 funkcje:

create PROC [dbo].[dba_BlockTracer]
AS

BEGIN

SET TRANSACTION ISOLATION LEVEL READ
UNCOMMITTED

IF EXISTS(SELECT 1 FROM sys.sysprocesses WHERE blocked != 0)
BEGIN

SELECT distinct t1.spid AS [Root blocking spids]
, t1.[loginame] AS [Owner]
, dbo.dba_GetSQLForSpid(t1.spid) AS [SQLText]
, t1.[cpu]
, t1.[physical_io]
, DatabaseName = DB_NAME(t1.[dbid])
, t1.[program_name]
, t1.[hostname]
, t1.[status]
, t1.[cmd]
, t1.[blocked]
, t1.[ecid]
FROM sys.sysprocesses t1, sys.sysprocesses t2
WHERE t1.spid = t2.blocked
AND t1.ecid = t2.ecid
AND t1.blocked = 0
ORDER BY t1.spid, t1.ecid

SELECT t2.spid AS [Blocked spid]
, t2.blocked AS [Blocked By]
, t2.[loginame] AS [Owner]
, dbo.dba_GetSQLForSpid(t2.spid) AS [SQLText]
, t2.[cpu]
, t2.[physical_io]
, DatabaseName = DB_NAME(t2.[dbid])
, t2.[program_name]
, t2.[hostname]
, t2.[status]
, t2.[cmd]
, t2.ecid
FROM sys.sysprocesses t1, sys.sysprocesses t2
WHERE t1.spid = t2.blocked
AND t1.ecid = t2.ecid
ORDER BY t2.blocked, t2.spid, t2.ecid
END

ELSE
PRINT 'No processes blocked.'

END

CREATE PROC [dbo].[dba_WhatSQLIsExecuting]
AS

BEGIN
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

SELECT [Spid] = session_Id
, ecid
, [Database] = DB_NAME(sp.dbid)
, [User] = nt_username
, [Status] = er.status
, [Wait] = wait_type
, [Individual Query] = SUBSTRING (qt.text,
er.statement_start_offset/2,
(CASE WHEN er.statement_end_offset = -1
THEN LEN(CONVERT(NVARCHAR(MAX), qt.text)) * 2
ELSE er.statement_end_offset END -
er.statement_start_offset)/2)
,[Parent Query] = qt.text
, Program = program_name
, Hostname
, nt_domain
, start_time
FROM sys.dm_exec_requests er
INNER JOIN sys.sysprocesses sp ON er.session_id = sp.spid
CROSS APPLY sys.dm_exec_sql_text(er.sql_handle)as qt
WHERE session_Id > 50
AND session_Id NOT IN (@@SPID)
ORDER BY 1, 2
END

CREATE Function [dbo].[dba_GetSQLForSpid]
(
@spid SMALLINT
)
RETURNS NVARCHAR(4000)

/*-------------------------------------------------

Purpose: Returns the SQL text for a given spid.

---------------------------------------------------

Parameters: @spid - SQL Server process ID.
Returns: @SqlText - SQL text for a given spid.
Revision History:
01/12/2006 Ian_Stirk@yahoo.com Initial version
Example Usage:
SELECT dbo.dba_GetSQLForSpid(51)
SELECT dbo.dba_GetSQLForSpid(spid) AS [SQL text]
, * FROM sys.sysprocesses WITH (NOLOCK)

--------------------------------------------------*/

BEGIN
DECLARE @SqlHandle BINARY(20)
DECLARE @SqlText NVARCHAR(4000)
-- Get sql_handle for the given spid.
SELECT @SqlHandle = sql_handle
FROM sys.sysprocesses WITH (nolock) WHERE
spid = @spid
-- Get the SQL text for the given sql_handle.
SELECT @SqlText = [text] FROM
sys.dm_exec_sql_text(@SqlHandle)
RETURN @SqlText

END

Posted in SQL | Leave a Comment »