<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://sqlserver.ro/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>T-SQL</title><link>http://sqlserver.ro/forums/15/ShowForum.aspx</link><description /><dc:language>en</dc:language><generator>CommunityServer 2.1 SP2 (Build: 61129.1)</generator><item><title>Re: modificare sql proc - deadlock sql server 2008</title><link>http://sqlserver.ro/forums/thread/8674.aspx</link><pubDate>Wed, 30 Mar 2011 08:20:50 GMT</pubDate><guid isPermaLink="false">963f3a18-65dd-4aad-905c-b785cfe1d7c7:8674</guid><dc:creator>B_gd_n[ ]Sahlean</dc:creator><slash:comments>0</slash:comments><comments>http://sqlserver.ro/forums/thread/8674.aspx</comments><wfw:commentRss>http://sqlserver.ro/forums/commentrss.aspx?SectionID=15&amp;PostID=8674</wfw:commentRss><description>CATCH este activat dacă severitatea se încadrează în limitele 11 - 19. Un deadlock (eroarea 1205) are severitatea 13 (”Msg 1205, Level 13, State 51, Line 1”).&amp;nbsp; Nu are sens să modifici severitatea unei erori interceptate de CATCH la 16 decât dacă este 19 (doar un admin poate folosi RAISERROR cu severitatea 19; pp. că utilizatorul care apelează procedurile stocate amintite nu este admin).&lt;br&gt;&lt;br&gt;LE: &lt;br&gt;Erland Sommarskog are un articol ft. bun pe tema gestiunii erorilor &lt;a href="http://www.sommarskog.se/error_handling_2005.html"&gt;Error Handling in SQL 2005 and Later&lt;/a&gt;.&lt;br&gt;</description></item><item><title>Re: modificare sql proc - deadlock sql server 2008</title><link>http://sqlserver.ro/forums/thread/8673.aspx</link><pubDate>Tue, 29 Mar 2011 13:41:11 GMT</pubDate><guid isPermaLink="false">963f3a18-65dd-4aad-905c-b785cfe1d7c7:8673</guid><dc:creator>Alex</dc:creator><slash:comments>0</slash:comments><comments>http://sqlserver.ro/forums/thread/8673.aspx</comments><wfw:commentRss>http://sqlserver.ro/forums/commentrss.aspx?SectionID=15&amp;PostID=8673</wfw:commentRss><description>am modificat si ExecTran pe acelasi principiu &lt;br /&gt;&lt;br /&gt;begin try &lt;br /&gt;begin tran &lt;br /&gt;.................cod mult................ &lt;br /&gt;commit tran &lt;br /&gt;end try &lt;br /&gt;begin catch &lt;br /&gt;if @@trancount &gt; 0 rollback tran &lt;br /&gt;declare @ERROR_MESSAGE nvarchar(4000), &lt;br /&gt;@ERROR_SEVERITY int &lt;br /&gt;select @ERROR_MESSAGE = ERROR_MESSAGE() + ' in SP: ' + isnull(ERROR_PROCEDURE() + ' line ' + convert(nvarchar, ERROR_LINE()), ''), &lt;br /&gt;@ERROR_SEVERITY = ERROR_SEVERITY() &lt;br /&gt;&lt;br /&gt;raiserror(@ERROR_MESSAGE, @ERROR_SEVERITY, 1)  &lt;br /&gt;end catch &lt;br /&gt;&lt;br /&gt;ca sa fiu sigur ca are severitate intre 11 si 19 nu e mai bine sa folosesc &lt;br /&gt;raiserror(@ERROR_MESSAGE, 16, 1) &lt;br /&gt;in loc de &lt;br /&gt;raiserror(@ERROR_MESSAGE, @ERROR_SEVERITY, 1) ?</description></item><item><title>Re: modificare sql proc - deadlock sql server 2008</title><link>http://sqlserver.ro/forums/thread/8672.aspx</link><pubDate>Tue, 29 Mar 2011 13:15:13 GMT</pubDate><guid isPermaLink="false">963f3a18-65dd-4aad-905c-b785cfe1d7c7:8672</guid><dc:creator>B_gd_n[ ]Sahlean</dc:creator><slash:comments>0</slash:comments><comments>http://sqlserver.ro/forums/thread/8672.aspx</comments><wfw:commentRss>http://sqlserver.ro/forums/commentrss.aspx?SectionID=15&amp;PostID=8672</wfw:commentRss><description>Depinde :-) este răspunsul corect : atât timp cât eroarea (inclusiv DL) din ExecTran poate fi detectată de blocul TRY CATCH din VireazaSal&amp;nbsp; și are severitatea între 11 și 19 da.&lt;br&gt;&lt;br&gt;Referitor la DL BOL spune: ”&lt;u&gt;TRY…CATCH can be used to handle deadlocks.&lt;/u&gt; The 1205 deadlock victim error can be 
caught by the CATCH block and the transaction can be rolled back until the 
threads become unlocked. ” (&lt;span id="nsrTitle"&gt;Using TRY...CATCH in Transact-SQL&lt;/span&gt; ). &lt;br&gt;</description></item><item><title>Re: modificare sql proc - deadlock sql server 2008</title><link>http://sqlserver.ro/forums/thread/8671.aspx</link><pubDate>Tue, 29 Mar 2011 12:50:11 GMT</pubDate><guid isPermaLink="false">963f3a18-65dd-4aad-905c-b785cfe1d7c7:8671</guid><dc:creator>Alex</dc:creator><slash:comments>0</slash:comments><comments>http://sqlserver.ro/forums/thread/8671.aspx</comments><wfw:commentRss>http://sqlserver.ro/forums/commentrss.aspx?SectionID=15&amp;PostID=8671</wfw:commentRss><description>o sa incerc sa aflu cauza deadlock-ului dar pana atunci imi trebuie o solutie provizorie.&lt;br /&gt;&lt;br /&gt;am scos linia return -1, intra-adevar am inteles si nu-si are rostul, nu o foloseam cum un scop anume ci doar a fost un copy paste neverificat :)&lt;br /&gt;&lt;br /&gt;Intrebarea mea este, asa cum arata procedura acum, daca am vreo eroare la nivelul procedurii ExecTran (deadlock sau orice altceva, care duce la neexecutarea cu succes a procedurii ExecTran) update-ul cu Virat =1 se executa?&lt;br /&gt;&lt;br /&gt;Multumesc.</description></item><item><title>Re: modificare sql proc - deadlock sql server 2008</title><link>http://sqlserver.ro/forums/thread/8670.aspx</link><pubDate>Tue, 29 Mar 2011 11:54:26 GMT</pubDate><guid isPermaLink="false">963f3a18-65dd-4aad-905c-b785cfe1d7c7:8670</guid><dc:creator>B_gd_n[ ]Sahlean</dc:creator><slash:comments>0</slash:comments><comments>http://sqlserver.ro/forums/thread/8670.aspx</comments><wfw:commentRss>http://sqlserver.ro/forums/commentrss.aspx?SectionID=15&amp;PostID=8670</wfw:commentRss><description>Cele două puncte nu sunt exclusive. Dacă ai timp încearcă să găsești cauza/ele apariției deadlock-ului.&lt;br&gt;&lt;br&gt;Încearcă să folosești tranzacții plus TRY ... CATCH și la nivelul procedurii ExecTran.&lt;br&gt;&lt;br&gt;Dpmdv RETURN -1 și RAISERROR sunt redundante în sensul că ambele semnalează apelantului apariția unei erori la nivelul procedurii VirareSal. Ai motive să folosești ambele soluții ?&lt;br&gt;&lt;br&gt;Dacă dorești să returnezi mesajul ”Suma a fost virată ...” poți să folosești un parametru OUTPUT în loc de RAISERROR(...,1,1).&lt;br&gt;&lt;br&gt;RAISERROR poate fi utilizată la fel ca funcția printf din C:&lt;br&gt;RAISERROR('Eroare %s in procedura %s linia %d', @Sev, 1, @ErrMsg, @ErrProc, @ErrLine)&lt;br&gt;&lt;br&gt;</description></item><item><title>Re: modificare sql proc - deadlock sql server 2008</title><link>http://sqlserver.ro/forums/thread/8669.aspx</link><pubDate>Tue, 29 Mar 2011 10:41:19 GMT</pubDate><guid isPermaLink="false">963f3a18-65dd-4aad-905c-b785cfe1d7c7:8669</guid><dc:creator>Alex</dc:creator><slash:comments>0</slash:comments><comments>http://sqlserver.ro/forums/thread/8669.aspx</comments><wfw:commentRss>http://sqlserver.ro/forums/commentrss.aspx?SectionID=15&amp;PostID=8669</wfw:commentRss><description>Multumesc pt raspuns.&lt;br /&gt;Pt varianta 2 este ok asa?&lt;br /&gt;&lt;br /&gt;CREATE proc VirareSal&lt;br /&gt; @ImportRef int,&lt;br /&gt; @IBANAngajat varchar(50) ,&lt;br /&gt; @ContD  varchar(50),            &lt;br /&gt; @Suma  money,            &lt;br /&gt; @ContC  varchar(50),            &lt;br /&gt; @DataTr  datetime,            &lt;br /&gt; @DataExec datetime,            &lt;br /&gt; @Comment varchar(200)           &lt;br /&gt;as &lt;br /&gt;set nocount on            &lt;br /&gt;declare @text varchar(200)&lt;br /&gt;BEGIN TRY&lt;br /&gt;BEGIN TRAN&lt;br /&gt;		if exists(select top 1 1 from V_SAL where ImportRef = @ImportRef and Virat = 0 and IBAN = @IBANAngajat)&lt;br /&gt;begin&lt;br /&gt;exec ExecTran @ContD, @Suma, @ContC,  @DataTr, @DataExec, @Comment&lt;br /&gt;				&lt;br /&gt;				update V_SAL&lt;br /&gt;				set Virat = 1&lt;br /&gt;				where ImportRef = @ImportRef and IBAN = @IBANAngajat and Virat = 0&lt;br /&gt;		end&lt;br /&gt;		else&lt;br /&gt;		begin&lt;br /&gt;			 set @text = 'Suma a fost virata deja pt IBAN: ' + @IBANAngajat&lt;br /&gt;			 raiserror(@text, 1, 1)&lt;br /&gt;		end&lt;br /&gt;COMMIT TRAN &lt;br /&gt;END TRY   &lt;br /&gt;BEGIN CATCH &lt;br /&gt;    	if @@trancount &gt; 0 ROLLBACK TRAN  &lt;br /&gt;    	declare @ERROR_MESSAGE        nvarchar(4000),    &lt;br /&gt;        @ERROR_SEVERITY        int    &lt;br /&gt;    	select @ERROR_MESSAGE = ERROR_MESSAGE() + ' in SP: ' + isnull(ERROR_PROCEDURE()  + ' line ' + convert(nvarchar, ERROR_LINE()), ''),    &lt;br /&gt;        @ERROR_SEVERITY = ERROR_SEVERITY()    &lt;br /&gt;    &lt;br /&gt;    	raiserror(@ERROR_MESSAGE, @ERROR_SEVERITY, 1)    &lt;br /&gt;    	return -1    &lt;br /&gt;END CATCH&lt;br /&gt;go</description></item><item><title>Re: modificare sql proc - deadlock sql server 2008</title><link>http://sqlserver.ro/forums/thread/8668.aspx</link><pubDate>Tue, 29 Mar 2011 10:01:15 GMT</pubDate><guid isPermaLink="false">963f3a18-65dd-4aad-905c-b785cfe1d7c7:8668</guid><dc:creator>B_gd_n[ ]Sahlean</dc:creator><slash:comments>0</slash:comments><comments>http://sqlserver.ro/forums/thread/8668.aspx</comments><wfw:commentRss>http://sqlserver.ro/forums/commentrss.aspx?SectionID=15&amp;PostID=8668</wfw:commentRss><description>1. Încearcă să elimini deadlock-ul. Pentru a obține informații despre deadlock poți creare un server-side trace care să intercepteze evenimentul ”Deadlock graph” sau poți activa flag-ul 1222. La fel de bine poți crea un trace folosind SQL Profiler dar acest implică (uzual) un overhead mai mare decât un trace server-side.&lt;br&gt;2. Folosește tranzacții și TRY ... CATCH. TRY ... CATCH poate intercepta un deadlock. În Books Online ai câteva exemple privitoare la TRY ... CATCH și tranzacții.&lt;br&gt;</description></item><item><title>modificare sql proc - deadlock sql server 2008</title><link>http://sqlserver.ro/forums/thread/8667.aspx</link><pubDate>Tue, 29 Mar 2011 09:12:46 GMT</pubDate><guid isPermaLink="false">963f3a18-65dd-4aad-905c-b785cfe1d7c7:8667</guid><dc:creator>Alex</dc:creator><slash:comments>0</slash:comments><comments>http://sqlserver.ro/forums/thread/8667.aspx</comments><wfw:commentRss>http://sqlserver.ro/forums/commentrss.aspx?SectionID=15&amp;PostID=8667</wfw:commentRss><description>salut, am procedura stocata de mai jos pe un sql server 2008&lt;br /&gt;&lt;br /&gt;CREATE proc VireazaSal&lt;br /&gt; @ImportRef int,&lt;br /&gt; @IBANAngajat varchar(50) ,&lt;br /&gt; @ContD  varchar(50),            &lt;br /&gt; @Suma  money,            &lt;br /&gt; @ContC  varchar(50),            &lt;br /&gt; @DataTr  datetime,            &lt;br /&gt; @DataExec datetime,            &lt;br /&gt; @Comment varchar(200)           &lt;br /&gt;as &lt;br /&gt;set nocount on            &lt;br /&gt;declare @text varchar(200)&lt;br /&gt; &lt;br /&gt;if exists(select top 1 1 from V_SAL where ImportRef = @ImportRef and Virat = 0 and IBAN = @IBANAngajat)&lt;br /&gt;begin&lt;br /&gt;exec ExecTrans @ContD, @Suma, @ContC,  @DataTr, @DataExec, @Comment&lt;br /&gt;		&lt;br /&gt;		update V_SAL&lt;br /&gt;		set Virat = 1&lt;br /&gt;		where ImportRef = @ImportRef and IBAN = @IBANAngajat and Virat = 0&lt;br /&gt;end&lt;br /&gt;else&lt;br /&gt;begin&lt;br /&gt;	 set @text = 'Suma a fost virata deja pt IBAN: ' + @IBANAngajat&lt;br /&gt;	 raiserror(@text, 1, 1)&lt;br /&gt;end&lt;br /&gt;go&lt;br /&gt;&lt;br /&gt;cateodata se intampla ca procedura ExecTrans sa dea deadlock si atunci nu vreau sa-mi mai faca update-ul cu Virat = 1, ce conditie trebuie sa pun a.i. update-ul cu Virat = 1 sa se faca doar daca ExecTran a fost executata cu succes?&lt;br /&gt;&lt;br /&gt;Multumesc.</description></item></channel></rss>