Tämä clippi demonstroi hyvin BULK INSERTin luonteen:
http://dbareactions.tumblr.com/post/48615498654/when-i-use-bulk-insert
Heh
Blogi tietokantaohjelmoinnista SQL Server ympäristössä
Tämä clippi demonstroi hyvin BULK INSERTin luonteen:
http://dbareactions.tumblr.com/post/48615498654/when-i-use-bulk-insert
Heh
Miten SQL Serverissä voi insertoida useita default-arvoja kantaan yhdellä insertillä? Oikea vastaus: käytä GO:ta. Ohessa tästä esimerkki:
USE Testi
GO
CREATE TABLE #testi
(
id INT IDENTITY(1, 1) PRIMARY KEY,
dt DATETIME DEFAULT GETDATE()
)
INSERT INTO #testi
DEFAULT VALUES;
GO 1000
SELECT *
FROM #testi
DROP TABLE #testi
Olen viimeaikoina saanut työskennellä lähinnä Oracle-kantojen kanssa. Eroavaisuuksia SQL Serveriin löytyy paljonkin. Yksi mielenkiintoinen eroavaisuus on mm. se miten Oracle käsittelee tyhjää arvoa. Toinen on hauska anekdootti on Oracle dual-taulu. Hyvät yhteenvedot Oraclen ja SQL Serverin eroavaisuuksista löytyy dba.se ja stackoverflow.com sivuilta löytyvistä kysymyksistä:
How to make a transition from SQL Server DBA to Oracle?
Basic differences between Oracle and SQL Server?
Hyviä SQL-skriboja kaipaa aina. Jokin aika sitten piti tutkia yhdellä SQL Server-palvelimella majailevia indeksejä. Kyhäilin omaa SELECT-lausetta kunnes huomasin RSS feedeistä, että SQL Fool oli tuottanut kaksi erinomaista indeksikyselyä SQL Server-yhteisön tarpeisiin. Otin nämä välittömästi omaan arkistooni ja käyttöön. Ota sinäkin.
SQL Server 2012 on tuonut uusia ominaisuuksia Master Data Services-tuotteeseen. Loppukäyttäjiä ajatellen ehkä paras ominaisuus on Excel add-in, joka mahdollistaa datan käsittelyn suoraan Excelillä ja tiedon viemisen sitä kautta MDS:n.
Ohessa linkkejä MDS:n käyttöön:
Muita linkkejä MDS:n:
Tietokannoissa hierarkioita hallitaan usein parent-child-tyyppisesti yhdessä taulussa. Tätä konstruktiota kutsutaan nimellä adjacent list. Raportointia varten tämä parent-child-hierarkia täytyy usein purkaa. Purku onnistuu parhaiten käyttämällä rekursiivista kyselyä, usein Common Table Expressionia. Löysin hyvän artikkelin, jossa tämä asia selitetään juurta jaksain. Ohessa tästä artikkelista lainattua koodia:
SET NOCOUNT ON;
USE Testi;
IF OBJECT_ID('dbo.Employees', 'U') IS NOT NULL DROP TABLE dbo.Employees;
CREATE TABLE dbo.Employees
(
empid INT NOT NULL PRIMARY KEY,
mgrid INT NULL REFERENCES dbo.Employees,
empname VARCHAR(25) NOT NULL,
salary MONEY NOT NULL,
CHECK (empid <> mgrid),
CHECK (empid > 0)
);
CREATE UNIQUE INDEX idx_unc_mgrid_empid ON dbo.Employees(mgrid, empid);
INSERT INTO dbo.Employees(empid, mgrid, empname, salary) VALUES
(1, NULL, 'David' , $10000.00),
(2, 1, 'Eitan' , $7000.00),
(3, 1, 'Ina' , $7500.00),
(4, 2, 'Seraph' , $5000.00),
(5, 2, 'Jiru' , $5500.00),
(6, 2, 'Steve' , $4500.00),
(7, 3, 'Aaron' , $5000.00),
(8, 5, 'Lilach' , $3500.00),
(9, 7, 'Rita' , $3000.00),
(10, 5, 'Sean' , $3000.00),
(11, 7, 'Gabriel', $3000.00),
(12, 9, 'Emilia' , $2000.00),
(13, 9, 'Michael', $2000.00),
(14, 9, 'Didi' , $1500.00);
select * from dbo.Employees
go
--puretaan hiearkia omiin kenttiin
;WITH Tree AS
(
SELECT empid, mgrid, 1 AS lvl,
CAST(STR(empid, 10) AS VARCHAR(900)) COLLATE Latin1_General_BIN2 AS pth
FROM dbo.Employees
WHERE mgrid IS NULL
UNION ALL
SELECT C.empid, C.mgrid, P.lvl + 1,
CAST(P.pth + STR(C.empid, 10) AS VARCHAR(900)) COLLATE Latin1_General_BIN2
FROM Tree AS P
JOIN dbo.Employees AS C
ON C.mgrid = P.empid
)
SELECT empid, lvl,
NULLIF(SUBSTRING(pth, 1, 10) + 0, 0) AS level1,
NULLIF(SUBSTRING(pth, 11, 10) + 0, 0) AS level2,
NULLIF(SUBSTRING(pth, 21, 10) + 0, 0) AS level3,
NULLIF(SUBSTRING(pth, 31, 10) + 0, 0) AS level4,
NULLIF(SUBSTRING(pth, 41, 10) + 0, 0) AS level5
FROM Tree;
Aina löytyy jotain uutta opittavaa, tänään keksin, että SQL Serveristä löytyy ominaisuus nimeltään Table Value Constructor. Ohessa esimerkki sen käytöstä:
USE AdventureWorks2008R2
GO
SELECT *
FROM
(VALUES
(101, 'Bikes'),
(102, 'Accessories'),
(103, 'Clothes')
) AS Category(CategoryID, CategoryName);
SELECT TOP 100 * FROM HumanResources.Department
SELECT d.Name, d.GroupName, Category.CategoryName
FROM HumanResources.Department AS d
INNER JOIN
(VALUES
(1, 'Cat1'),
(2, 'Cat2'),
(3, 'Cat3')
) AS Category(CategoryID, CategoryName)
ON d.departmentID = Category. CategoryID
Jokaisen itseään kunnioittavan kantapeikon on käytettävä SQL-skriboissa ASCII-taidetta, joka kertoo olennaisen skriptistä. Esim. näin:
PRINT 'TTTTTTTTTTTTTTTTTTTTTTT SSSSSSSSSSSSSSS QQQQQQQQQ LLLLLLLLLLL ' PRINT 'T:::::::::::::::::::::T SS:::::::::::::::S QQ:::::::::QQ L:::::::::L ' PRINT 'T:::::::::::::::::::::T S:::::SSSSSS::::::S QQ:::::::::::::QQ L:::::::::L ' PRINT 'T:::::TT:::::::TT:::::T S:::::S SSSSSSSQ:::::::QQQ:::::::QLL:::::::LL ' PRINT 'TTTTTT T:::::T TTTTTT S:::::S Q::::::O Q::::::Q L:::::L ' PRINT ' T:::::T S:::::S Q:::::O Q:::::Q L:::::L ' PRINT ' T:::::T S::::SSSS Q:::::O Q:::::Q L:::::L ' PRINT ' T:::::T --------------- SS::::::SSSSS Q:::::O Q:::::Q L:::::L ' PRINT ' T:::::T -:::::::::::::- SSS::::::::SS Q:::::O Q:::::Q L:::::L ' PRINT ' T:::::T --------------- SSSSSS::::S Q:::::O Q:::::Q L:::::L ' PRINT ' T:::::T S:::::SQ:::::O QQQQ:::::Q L:::::L ' PRINT ' T:::::T S:::::SQ::::::O Q::::::::Q L:::::L LLLLLL' PRINT ' TT:::::::TT SSSSSSS S:::::SQ:::::::QQ::::::::QLL:::::::LLLLLLLLL:::::L' PRINT ' T:::::::::T S::::::SSSSSS:::::S QQ::::::::::::::Q L::::::::::::::::::::::L' PRINT ' T:::::::::T S:::::::::::::::SS QQ:::::::::::Q L::::::::::::::::::::::L' PRINT ' TTTTTTTTTTT SSSSSSSSSSSSSSS QQQQQQQQ::::QQLLLLLLLLLLLLLLLLLLLLLLLL' PRINT ' Q:::::Q ' PRINT ' QQQQQQ ' SET NOCOUNT ON; SELECT TOP 1 * FROM sys.objects;
Vinkki tähän saatu SSIS Junkielta, ASCII-taidetta voi käydä vääntämässä online-työkalussa.
Monesti PowerShellin haluaa aukeavan suoraan johonkin kansioon niin, että Powershellin prompti on suoraan ko. hakemistossa. Se onnistuu Windows Explorerista seuraavasti:
Great!
Kommentit