Archive for the ‘SQL SERVER’ Category

Cannot use the ROLLBACK statement within an INSERT-EXEC statement

Şubat 7, 2013

MSSQL de arkadaşımın aldığı bir hata.

Sık karşılaşılan bir durum olmadığı için yazmak istedim.

Bir tabloya yapılan Insert ‘ün,  bir sp’nin exec ‘in sonucu ise ve bu sp exec, içerisinde bir transaction yönetiyorsa, olası bir rollback durumunda bu hata alınmaktadır.

Hatayı üreten yapı aşağıdaki gibidir;

1-) temp bir tablo oluşurun

create table #t ( a int , b int )

2-)Aşağıdaki gibi bir veri kümesi dönen bir sp niz olsun. Bu sp’de transction açıp, Rollback yapacak bir kod bloğu olsun.

create procedure sp
(@startTrx int,
@a int, @b int)
as
begin
select @a, @b union all
select @b, @a

if ( @startTrx = 1 )
begin
begin tran
select @b, @a
rollback
end
end

3-)Aşağıdaki Insert hata üretmez
Insert Into #t
exec sp 0, 2,3

4-)Ama aşağıdaki Insert yukarıdaki hatayı üretir.
Insert Into #t
exec sp 1, 4,5

Çözüm Olarak;
SP de transation yönetmeyin. 😦

Mssql, Sonucun Tümünü Görmek

Ocak 11, 2013

Sql de  script çalıştırıldığında “Result To Text” modunda, belirli bir büyüklüğün üzerindeki sonuç tam olarak gösterilmemektedir.

Bunun Tools\Options altında aşağıdaki gibi bir ayar vardır. Buradaki değeri 8000 gibi büyük bir rakam yaparsanız sonucun tamamını görebilirsiniz.

SqldeSonucunTamaminiGormek

Datetime2

Şubat 4, 2012

SqlSever’ın 2008 R2 ile gelen yeni veri tipi.

Daha geniş bir range sunmakta imiş.

Benim 3-4 saatimi alan bir bug a çözüm oldu.

Eğer uygulama sunucunuz 64 bit Windows 2008 R2 ise, ve 64 Bit SqlServer’ da C++ ile çalıştırdığınız bir function anlamsız bir şekilde aşağıdaki hatayı üretebilir.

[80004005] SRC:Microsoft SQL Server Native Client 10.0 DESC:Error converting data type varchar to numeric. SQL:22018

Bu hataya bir çözüm olarak Function’ın Return tipini Datetime2 olarak değiştirdim, tabi V2 lisini yaparak.

Sequence SQL Server

Aralık 25, 2011

Sql 2012 ile beraber gelecek bir yapı. Oracle daki sequence ile aynı olacak.

İhtiyaçtı, sonunda yapmışlar. Identity özelliğinin karşılayamadığı bazı durumlar için ilaç gibi olacak.

MSSQL Satır satır update script’i oluşturuken alınan hata

Eylül 20, 2011

MSSQL de büyük tabloları toptan güncellemek sıkıntılıdır.

Bunun yerine satır satır güncelleme script leri oluşturarark ilgili işlem yapılabilir.

Text formatında satır satır script oluştururken her iki update cümleciği arasına “char(13)+char(10)+’ go ‘+char(13)+char(10)” ifadesi konmalıdır.

Aksi takdirde script te herhangi bir hata olmadığı hata hata mesajı vermekte ve saç baş yoldurmaktadır.

SQL de Lock lar

Ocak 19, 2010

Bu konuda özet bir döküman.
Bende fırsat buldukça yazacağım.
http://www.mssqlcity.com/Articles/Adm/SQL70Locks.htm

SQL ClustredIndex, Muhteşemsin

Ocak 19, 2010

SQL de clustered index in önemini bir kez daha anladım.
içerisinde 500.000 kayıt olan bir tabloda 8000 lik bir loop ta, 1400 kayıt için 21 dakika zaman harcarken, clusteredIndex leri oluşturduğumda saniyeler içerisinde 8000 kaydı işledim.

Bu performans makinaya ve daha farklı ögelere de bağlı olmakla beraber, ana olarak clusterd Index in önemini bir kez hada hatırlattı bana

SQL, Sayı Üretme, RAND, NEWID

Ocak 15, 2010

Sql de sayı üretme bazen bir sorun olabilir.
RAND fonksiyonu 0 -1 arası bir değer üretmektedir.
NEWID ise bildiğimiz GUID gibi bir uniqueidentifier üretmektedir.

Burada bir 10 satır bir veri dönen selection içerisinde her bir satır için bir int değer üretme olayını nasıl yaparız?

SELECT TOP 10 RAND() , ( ABS(CAST(CAST(NEWID() AS VARBINARY) AS INT)) % 15 ) +1 FROM XXX_TABLE

Mesela burada, 2.kolonda mod(15) e göre bir int değer üretmektedir.

SqlServer da 10/3 = 3 Neden?

Mart 31, 2009

SqlServer, 10/3 dediğimizde 1 sonucunu üretir. Çünki bu işlemi integer bölme olarak algılıyor.

Select 10/3  –>3

virgüllü değeri elde etmek için,

select convert(numeric(17,2),(10 / (convert(numeric(17,2),3)))) –> 3.33

Sql Server – Try – Catch

Şubat 5, 2009

Sql 2005 ile gelen try-catch mekanizmasında bir yazılımcının ilk anda anlayacağından farklı bir yaklaşımlar bulunmaktadır.

Mesela neyi yakalamaıyor?

INSERT INTO TableXX , dediğinizde, bu TableXX database’de yoksa bir exception üretiliyor. Ama bu exception Sql Server tarafından yakalanamıyor. Bir yazılımcı default olarak bunun yakalanmasını bekler.

Bu durumun MSDN nin TRY-CATCH dökümanlarında da böyle olduğu yazıyor. Ama default yaklaşım bu değil.

Mikrosoft burada eski mimarisinin azizliğine uğramış gibi görünüyor.