T-sql Komutları etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
T-sql Komutları etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

27 Haziran 2014 Cuma

MSSQL Server Büyük Küçük Karakter Önemseyerek (CASE SENSETIVE) Arama

MSSQL server normal select-where komutu ile büyük küçük harf ayrımı yapmadan arama yapmakta örneğin şöyle bir arama yaptığımızda aşağıdaki sonuçlar dönmekte.
biz arama kısmına ana sayfa yı ara dememize rağmen MS-SQL server bie ANA SAYFA ve Ana Sayfa bilgilerinide getirdi.Peki sadece aradığımız kavramın bulunmasını istersen ne yapabiliriz.
Bunun için şöyle bir sorgu yazılabilir.


Gördüğümüz gibi Collate metodu işimize yaradı ANA SAYFA kaydını bize getirmedi peki derseniz ki SQL_Latin1_General_CP1254_CI_AS nedir diye.
Bu  collation serisi Türkçe karakter setinin de bulunduğu gibi değerlerin case-insensitive durumunu belirler ve her dil için özel bir collation yazmak gerekir.

8 Aralık 2009 Salı

T-SQL Haftanın gününü veren fonksiyon

MS SQL üzerinde haftanın gününü veren fonksiyona ihtiyaç duyanlar için ;

CREATE FUNCTION [dbo].[udf_DayOfWeek](@dtDate DATETIME)
RETURNS VARCHAR(10)

AS
BEGIN
DECLARE @rtDayofWeek VARCHAR(10)
SELECT @rtDayofWeek = CASE DATEPART(weekday,@dtDate)
WHEN 1 THEN 'Sunday'
WHEN 2 THEN 'Monday'
WHEN 3 THEN 'Tuesday'
WHEN 4 THEN 'Wednesday'
WHEN 5 THEN 'Thursday'
WHEN 6 THEN 'Friday'
WHEN 7 THEN 'Saturday'
END
RETURN (@rtDayofWeek)
END

fonksiyonun kullanımı ise şöyle ;
SET @dayname =dbo.udf_DayOfWeek(GETDATE())

datatime tarih ve saat yerdeğiştirmesi

Yakın bir zamanda çok farklı bir seneryoyla karşılaştım ve çözümümü paylaşmak istedim seneryo şöyle ; Microsoft SQL Server üzerindeki bir tabloda
VallTime , VallDate isimli  iki sutun vardı ve değerleri  2009-11-09 12:23:00.000  ve
2009-10-09 10:12:10.000  olan verilerin birinin tarih bilgisiyle diğerinin saat bilgisini alarak datetime biçiminde birleştirmekti. özetle ;
2009-11-09 12:23:00.000     +   2009-10-09 10:12:10.000   = 2009-10-09 12:23:00.000

birleştirmek için gerekli olan T-SQL

CREATE FUNCTION [dbo].[COMBINE_DTM]
(
@inDATE_DTM AS datetime,
@inTIME_DTM AS datetime
)
RETURNS datetime
AS
BEGIN
RETURN
CAST((ROUND(CAST(@inDATE_DTM AS float), 0, 1)) AS float) +
(CAST(@inTIME_DTM AS float) - (ROUND(CAST(@inTIME_DTM AS float), 0, 1)) + .00000001)
END
 
Bu Scaler-Valued fonksiyonun kullanımı ise şöyle ;
 
declare @calltime datetime , @calldate datetime , @Combinedatetime datetime
select @calldate = CallDate,@calltime = CallTime from tbJobs where JobID = @JobID and deleted = 0;

set @Combinedatetime= dbo.COMBINE_DTM(@calldate,@calltime)

7 Aralık 2009 Pazartesi

MSSQL Cursor Kullanımı

Cursor çekitiğimiz sorgu içerisinde satır satır dönerek işlemlerimizi yapmamızı sağlayan bir yapıdır.
Altaki örnek de kullanıcıların mail adresleri ile ilgili tabloya tek tek mail gönderilmesi sağlanmakta.
önce işlem yapacağımız veritabanını oluşturalım.
GO
CREATE TABLE EmailList
 (
id smallint identity(1,1),
email varchar(500),
name nvarchar(500),
emailsent bit default 0,
sentdate datetime
)

sonra veri girişi yapalım
INSERT INTO EmailList (email, name) VALUES ('emailaddress1@test.com', N'Darth Vader')
INSERT INTO EmailList (email, name) VALUES ('emailaddress2@test.com', N'Bill Gates')
INSERT INTO EmailList (email, name) VALUES ('emailaddress3@test.com', N'Katy Perry')

daha sonra procedure yazalım .
CREATE PROC SendEmailCursor


AS


-- eMail Variables --
DECLARE @email_subject nvarchar(1000)
DECLARE @email_body nvarchar(max)


SET @email_body = N'Welcome to our Community'
SET @email_body = N'Dear {0},
We''re glad to see you.'
-- eMail Variables (END) --


-- Cursor Variables --
DECLARE @Id smallint;
DECLARE @email varchar(500);
DECLARE @name nvarchar(500);
-- Cursor Variables (END) --


DECLARE @pbody nvarchar(max)


------------------ CURSOR eMail --------------------
DECLARE eMailCursor CURSOR FAST_FORWARD FOR
SELECT
id, email, name
FROM EmailList
WHERE emailsent = 0


OPEN eMailCursor


FETCH NEXT FROM eMailCursor INTO @Id, @email, @name


WHILE @@FETCH_STATUS = 0
BEGIN
---
SET @pbody = REPLACE(@email_body, '{0}', @name)


EXEC msdb.dbo.sp_send_dbmail
@profile_name = N'TBS',
@recipients = @email,
@subject = @email_subject,
@body = @pbody,
@body_format = 'HTML'


UPDATE EmailList SET emailsent = 1, sentdate = GetDate() WHERE id = @Id
---
FETCH NEXT FROM eMailCursor INTO @Id, @email, @name
END


CLOSE eMailCursor
DEALLOCATE eMailCursor
------------------ CURSOR eMail (END) --------------------


GO


ve çalıştıralım

EXEC SendEmailCursor


Cursor ile ilgili bilgi;
FETCH FIRST komutu ile ilk satıra dönüp FETCH LAST komutu ile de son satıra gidebiliriz. SQL SERVER en son işletilen FETCH komutunun durumunu @@FETCH_STATUS degişkeninde tutar. FETCH komutu başarılı ise 0, başarısız ise -1, FETCH edilen satır bulanmıyorsa da -2 döner.

10 Ekim 2009 Cumartesi

MSSQL bir veritabanında diğer bir veritabanına tablo kopyalamak

SELECT * INTO NewTable FROM existingdb.dbo.existingtable
Sorgusu aynı veritabanında bir veritabanından diğer bir veritabanına NewTable isimli bir tablo kopyalıyor işin ilginci ise hedef tabloda NewTable olmasına gerek yok.Kendisi tabloyu oluşturacak.