Koray Kırdinli

Yazılım ve İş Yaşamı Hakkında Paylaşımlar

Bir tablo adı geçen Stored Procedure’lerin listesini almak.

Bir tablo adının geçtiği stored prosedürleri bulmak için aşağıdaki select ten faydalanabilirsiz.  Tabi sadece tablo adı değil herhangi bir kelime de aratabilirsiniz.  Bundan sonraki arama işlemleri artık yaratıcılığınıza kalmış.
SELECT DISTINCT *
FROM syscomments sc
INNER JOIN sysobjects so ON sc.id=so.id
INNER JOIN sys.procedures AS p ON p.[object_id]=sc.id
INNER JOIN sys.schemas s ON s.[schema_id] = p.[schema_id]
WHERE sc.TEXT LIKE ‘%TABLE_NAME%’ AND s.name = ‘SCHEMA_NAME’
Reklamlar

Eylül 23, 2014 Posted by | MSSql | , | Yorum bırakın

SQL Tabloda Duplike Kayıtları Silmek (lockres)

Aşağıdaki sql örneği ile duplike kayıtları silmek mümkün. lockres pseudo kodu o rowun fiziksel adresini gösteriyor.

CREATE TABLE TabloAdi (
Column1 varchar(1),
Column2 int
)

INSERT INTO TabloAdi VALUES (‘A’, 1);
INSERT INTO TabloAdi VALUES (‘A’, 1); — duplicate
INSERT INTO TabloAdi VALUES (‘A’, 2);
INSERT INTO TabloAdi VALUES (‘B’, 1);
INSERT INTO TabloAdi VALUES (‘B’, 2);
INSERT INTO TabloAdi VALUES (‘B’, 2); — duplicate
INSERT INTO TabloAdi VALUES (‘B’, 2); — duplicate
INSERT INTO TabloAdi VALUES (‘B’, 2); — duplicate
INSERT INTO TabloAdi VALUES (‘C’, 2)
SELECT *,%%lockres%%
FROM TestTable a
ORDER BY a.Column1, a.Column2

DELETE
FROM TabloAdi
WHERE TabloAdi.%%lockres%%
NOT IN (SELECT MIN(b.%%lockres%%)
FROM TabloAdi b
GROUP BY b.column1, b.Column2)

SELECT Column1,Column2,%%lockres%%
FROM TabloAdi a
ORDER BY a.Column1, a.Column2

Herkese iyi günler dilerim…

Aralık 21, 2012 Posted by | MSSql | , , | 1 Yorum

The server principal “sqlLoginName” is not able to access the database “myDatabaseName” under the current security context.

Şirkette geçenlerde DRC(Disastery Recovery Center)  serverlarımızda bir test yapmak için bir veritabanı uygulaması publish ettik ve loglarında bu hata ile karşılaştık. Biraz araştırunca sql server’ın restore olması sırasında syslogin SID si ile sysuser SID sinin uyuşmuyor olabileceğini gördük.
Aşağıdaki sorgularla SID leri karşılaştırdık.

USE <myDatabaseName>
SELECT sid FROM sys.sysusers WHERE name = ‘userName’
SELECT sid FROM sys.syslogins WHERE name = ‘userName’

ve aşağıdaki stored prosedür ile de problemi çözdük.
EXEC sp_change_users_login @Action=’update_one’, @UserNamePattern=’userName’,@LoginName=’userName’


You can see that the SID does not match the system views: sys.sysusers and sys.syslogins

SELECT sid FROM sys.sysusers WHERE name = ‘sqlLoginName’
SELECT sid FROM sys.syslogins WHERE name = ‘sqlLoginName’

http://blogs.technet.com/b/mdegre/archive/2010/08/28/the-server-principal-quot-sqlloginname-quot-is-not-able-to-access-the-database-quot-mydatabasename-quot-under-the-current-security-context.aspx

 

Aralık 5, 2012 Posted by | MSSql | , , , , | Yorum bırakın

T-SQL’de duplike kayıtları silmek (With kullanımı)

CREATE TABLE tablo (Col1 INT, Col2 INT)
GO

INSERT INTO tablo VALUES(1,1),(1,1), –duplicate
(1,1), –duplicate
(1,2),
(1,2), –duplicate
(1,3),
(1,4)
GO

SELECT * FROM tablo
GO

WITH CTE (COl1,Col2, DuplicateCount)
AS
(
SELECT COl1,Col2,
ROW_NUMBER() OVER(PARTITION BY COl1,Col2 ORDER BY Col1) AS DuplicateCount
FROM tablo
)
DELETE
FROM CTE
WHERE DuplicateCount > 1
GO

SELECT * FROM tablo
GO

DROP TABLE tablo

Buradaki CTE ,  Common Table Expression demektir ve bize rekülsive sorguları basitleştirmek için bir yöntem sunar.
WITH CTE name ( columns)
AS ( CTE definition )
SELECT|INERT|UPDATE|DELETE… FROM… CTE name
DEtaylı bilgiyi aşağıdaki linklerden edinebilirsiniz.
http://www.csharpnedir.com/articles/read/?id=477&title=SQL%20Server%202005%20:%20Recursive%28%C3%96z-yinelemeli%29%20Sorgular%20ve%20CTE

http://msdn.microsoft.com/en-us/library/ms175972.aspx

Şubat 22, 2012 Posted by | MSSql | , , , | Yorum bırakın

SQL With Rollup Kullanımı

Merhabalar bu yazımda bir projemde araç istatistiklerini gösteren bir sql sorgusu yazmıştım bunu ne amaçla ve nasıl yaptığımı anlatmak istiyorum. _HAREKET isimli tablomdan araçla ilgili yapmış olduğu KM , yaptığı ciro , kaç sefer yaptığı ve bunların aylık toplamları gibi bilgilerden bir rapor oluşturmam gerekliydi.Bu raporu oluşturabilmem için öncelikle Araçlara göre gruplamam gerekliydi çünkü her satırda tek aracın bilgileri olmalıydı. Bu yüzden öncelikle GROUP BY kullanmaya karar verdim. Daha sonra da bu prosedüre ay ve yıl bilgisini dışardan göndererek filtreleme yaptırdım. Son olarak kilit nokta bu sorgudaki alt toplamı aldırmaktı.İşte bunu Sql’de yapan komut WITH ROLLUP komutu idi.

Bu komut group by sonuna yazıldığı zaman grup bazında alınan toplamların en üstte bütün grupların toplamını aldırmakta.

Sorgumuz şu şekilde

declare @ay int,@yil int

SELECT @ay=10,@yil=2008

 

SELECT A.AracNo,MAX(A.PlakaNo) As PlakaNo,isnull(SUM(H.SCikan),0) As Toplam_Sevk,

isnull(SUM(H.CBorc),0) As Ciro,COUNT(H.SCikan) As Sefer_Sayisi,

(SELECT isnull(SUM(AH2.AGider),0) FROM _ARACHAREKET AH2

Left Join _HAREKET H On AH2.HareketNo=H.HareketNo

WHERE MONTH(H.Tarih)=@ay AND YEAR(H.Tarih)=@yil AND AH2.AracNo=A.AracNo) AS Arac_Gideri,

(SELECT ROUND(isnull(AVG(AH2.KMde_Yaktigi),0),2) FROM rArac_Hareketleri AH2

 WHERE AH2.AracNo=A.AracNo AND MONTH(AH2.Tarih)=@ay AND YEAR(AH2.Tarih)=@yil ) As KM_OrtalamaYakit

 FROM _ARACHAREKET AH 

Left Join _HAREKET H On AH.HareketNo=H.HareketNo Left Join _ARAC A On A.AracNo=AH.AracNo

WHERE   MONTH(Tarih)=@ay AND YEAR(Tarih)=@yil

GROUP BY A.AracNo

WITH ROLLUP

Nisan 15, 2009 Posted by | MSSql | , , , , , , | Yorum bırakın

SQL 2005 de PIVOT kullanımı

Bu yazıda internetteki araştırmalarım sonucunda hoşuma giden veritabanı ve programcılık konusundaki pratikleri paylaşacağım. Bu yazıyı her yeni pratik bulduğumda güncellemeyi düşünüyorum.

1 – SQL Server 2005 ve üzerinde PIVOT-UNPIVOT keywordları ile bir tablodaki sütunları satırlara satırları sütunlara çevirmeniz mümkün.Sql 2000’de bunu yapmak için çok efor sarfetmek gerekiyordu.Performans açısından fazla bir fark olmamasına rağmen kullanım olarak bizlere kolaylık sağladığı kesin.

İki tane tablomuz olsun.Bir tanesi stok kartlarımızı listesin diğeri de bu kart üzerinde yapılan işlemleri listelesin.

CREATE TABLE Stok(
stokkod int,
stokad
)
CREATE TABLE Hareket(
hareketno int,
stokkod int,
fistipi NVARCHAR(30),
deger SQL_VARIANT
)

Şimdi şöyle bir şeye ihtiyacımız olduğunu düşünelim. Her bir fiştipini sütunlarda göstererek şöyle bir tablo elde etmeliyiz
StokAdı -AlımFaturası – SatışFaturası
1                –  200                –  300
2               –  200                – 400

Eski teknikle şöyle bir sorgu yapardık muhtemelen
SELECT
(SELECT SUM(deger) FROM Hareket WHERE fistipi=’Alım Faturası’ AND stokkod=S.Stokkod) As AlimFaturasi,
(SELECT SUM(deger) FROM Hareket WHERE fistipi=’Satış Faturası’ AND stokkod=S.Stokkod) As SatisFaturasi
FROM Stok S

YENİ YÖNTEMLE

SELECT S.*
FROM Hareket
PIVOT
(
SUM( deger )
FOR ozellik IN( [Alım Faturası] , [Satış Faturası] )
) AS S
WHERE StokKod>0

Sorgunun çalışıp çalışmadığını sql server 2005 kurulu olmadığı için deneme fırsatım olmadı ancak burada önemli olan mantığı kavramak ve müşterilere daha anlamlı ve güzel raporlar sunabilmek.

Herkese iyi çalışmalar

Mart 20, 2009 Posted by | MSSql | , , | Yorum bırakın