<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>procedures &#8211; SQLpowered.com</title>
	<atom:link href="https://sqlpowered.com/tag/procedures/feed/" rel="self" type="application/rss+xml" />
	<link>https://sqlpowered.com</link>
	<description>SQL Server + BI</description>
	<lastBuildDate>Wed, 12 Jun 2024 11:18:15 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://sqlpowered.com/wp-content/uploads/2020/07/FavIcon-e1594067873682-99x100.png</url>
	<title>procedures &#8211; SQLpowered.com</title>
	<link>https://sqlpowered.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Numbered Stored Procedures</title>
		<link>https://sqlpowered.com/numbered-stored-procedures/</link>
					<comments>https://sqlpowered.com/numbered-stored-procedures/#respond</comments>
		
		<dc:creator><![CDATA[Jan Dvořák]]></dc:creator>
		<pubDate>Wed, 12 Jun 2024 11:16:05 +0000</pubDate>
				<category><![CDATA[T-SQL]]></category>
		<category><![CDATA[procedures]]></category>
		<guid isPermaLink="false">https://sqlpowered.com/?p=5682</guid>

					<description><![CDATA[Numbered stored procedures are a lesser-known feature that allows multiple procedures to share the same name but are distinguished by a numeric suffix. This feature can be useful in certain scenarios, although it is not commonly used in modern database development. Numbered stored procedures allow you to create a series...]]></description>
										<content:encoded><![CDATA[<p>Numbered stored procedures are a lesser-known feature that allows multiple procedures to share the same name but are distinguished by a numeric suffix. This feature can be useful in certain scenarios, although it is not commonly used in modern database development.</p>
<p>Numbered stored procedures allow you to create a series of procedures that share the same base name, but each is distinguished by a unique integer. For example, you can have procedures named <code>MyProc;1</code>, <code>MyProc;2</code>, and so on. This can be useful for organizing related procedures or implementing certain types of versioning.</p>
<h2>Syntax and Usage</h2>
<p>The basic syntax for creating numbered stored procedures is:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="sql">CREATE PROCEDURE procedure_name;number
AS
BEGIN
    -- SQL statements
END
</pre>
<p>To execute a numbered stored procedure, you use the following syntax:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="sql">EXEC procedure_name;number
</pre>
<h2>Example</h2>
<p>Let&#8217;s create a series of numbered stored procedures that demonstrate a simple use case.</p>
<h3>Create the first procedure in the series:</h3>
<pre class="EnlighterJSRAW" data-enlighter-language="sql">CREATE PROCEDURE MyProc;1
AS
BEGIN
    SELECT 'This is procedure 1' AS Message;
END
</pre>
<h3>Create the second procedure in the series:</h3>
<pre class="EnlighterJSRAW" data-enlighter-language="sql">CREATE PROCEDURE MyProc;2
AS
BEGIN
    SELECT 'This is procedure 2' AS Message;
END
</pre>
<h3>Create the third procedure in the series:</h3>
<pre class="EnlighterJSRAW" data-enlighter-language="sql">CREATE PROCEDURE MyProc;3
AS
BEGIN
    SELECT 'This is procedure 3' AS Message;
END
</pre>
<h2>Executing Numbered Stored Procedures</h2>
<p>To execute these procedures, use the following commands:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="sql">EXEC MyProc;1
EXEC MyProc;2
EXEC MyProc;3
</pre>
<p>Each execution will return the message defined in the respective procedure.</p>
<h2>Managing Numbered Stored Procedures</h2>
<p>To drop a specific numbered stored procedure, use the following syntax:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="sql">DROP PROCEDURE procedure_name;number
</pre>
<p>For example, to drop <code>MyProc;2</code>, you would use:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="sql">DROP PROCEDURE MyProc;2
</pre>
<h2>Advantages and Disadvantages</h2>
<h3>Advantages:</h3>
<ul>
<li><strong>Organization:</strong> Numbered stored procedures can help organize related procedures under a common base name.</li>
<li><strong>Versioning:</strong> They can be used to manage different versions of a procedure without renaming the base procedure.</li>
</ul>
<h3>Disadvantages:</h3>
<ul>
<li><strong>Complexity:</strong> Numbered stored procedures can add complexity to database management and maintenance.</li>
<li><strong>Obsolescence:</strong> This feature is not widely used or supported in modern SQL Server practices, making it less familiar to many developers and DBAs.</li>
</ul>
<h2>Conclusion</h2>
<p>While numbered stored procedures offer a way to organize and manage related SQL procedures, they are not commonly used in contemporary SQL Server development. Understanding this feature can be useful for legacy systems or specific scenarios where such organization is beneficial. However, for most purposes, it is recommended to use more modern techniques for managing stored procedures, such as naming conventions and version control systems.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://sqlpowered.com/numbered-stored-procedures/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Jak chytře na zápis volání sp_executesql?</title>
		<link>https://sqlpowered.com/sp_executesql/</link>
					<comments>https://sqlpowered.com/sp_executesql/#respond</comments>
		
		<dc:creator><![CDATA[Jan Dvořák]]></dc:creator>
		<pubDate>Sun, 30 Apr 2017 20:46:51 +0000</pubDate>
				<category><![CDATA[T-SQL]]></category>
		<category><![CDATA[procedures]]></category>
		<guid isPermaLink="false">https://sqlpowered.com/?p=622</guid>

					<description><![CDATA[sp_executesql známe a používáme všichni pro vykonání dynamicky generovaného T-SQL kódu. Viděl jsem již nejrůznější zápisy a jmenné konvence, které se zdály na první pohled nekomplikované a vyhovující, ale s narůstající složitostí kódu se více a více od ideálu vzdalovaly. V průběhu let praxe jsem si oblíbil zápis níže, který...]]></description>
										<content:encoded><![CDATA[<p>sp_executesql známe a používáme všichni pro vykonání dynamicky generovaného T-SQL kódu. Viděl jsem již nejrůznější zápisy a jmenné konvence, které se zdály na první pohled nekomplikované a vyhovující, ale s narůstající složitostí kódu se více a více od ideálu vzdalovaly.</p>
<p>V průběhu let praxe jsem si oblíbil zápis níže, který rovnou řeší většinu skrytých problémů a pozdějších nepříjemností, a to zejména tím, že jasně odlišuje vstupní a výstupní dynamické parametry pomocí přípon IN a OUT od jejich bratříčků a hlavní linii kódu:</p>
<pre class="lang:tsql decode:true ">DECLARE @Stmt NVARCHAR(MAX)
DECLARE @Params NVARCHAR(500)

DECLARE @NoteId UNIQUEIDENTIFIER
DECLARE @NoteText VARCHAR(4000)
 
SET @NoteId = '475ACAB7-C19B-4CF6-A6E9-4B911C504419'

SET @Stmt = N'SELECT @NoteTextOUT = NoteText
                     FROM TESTDB.dbo.tblNote
                     WHERE Id = @NoteIdIN'
 
SET @Params = N'@NoteIdIN UNIQUEIDENTIFIER, @NoteTextOUT VARCHAR(4000) OUTPUT';
 
EXECUTE sp_executesql @Stmt, @Params, 
                      @NoteIdIN = @NoteId, 
                      @NoteTextOUT = @NoteText OUTPUT;</pre>
<p>Samozřejmě, že si stále musíte pamatovat, na které straně (vlevo či vpravo) mají být dynamické a hlavní deklarované parametry, ale to už vyplývá ze samotné implementace sp_executesql procedury, která sama o sobě porušuje pravidla pro volání standardních uložených procedur tím, že pro část parametrů dovoluje jejich přímou deklaraci a pro další část (uživatelskou) jejich deklaraci jako hodnota = hodnota.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://sqlpowered.com/sp_executesql/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Nedokumentované uložené procedury</title>
		<link>https://sqlpowered.com/nedokumentovane-ulozene-procedury/</link>
					<comments>https://sqlpowered.com/nedokumentovane-ulozene-procedury/#respond</comments>
		
		<dc:creator><![CDATA[Jan Dvořák]]></dc:creator>
		<pubDate>Tue, 19 May 2015 06:13:02 +0000</pubDate>
				<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[procedures]]></category>
		<guid isPermaLink="false">https://sqlpowered.com/?p=663</guid>

					<description><![CDATA[Každá edice SQL Serveru zahrnuje množství uložených a extended procedur, které nejsou zmíněny v oficiální dokumentaci, což znamená především to, že jsou určeny pouze pro interní potřebu Microsoftu a mohou být kdykoliv změněny nebo odstraněny. Přesto je spousta z nich nebývale užitečná a používána široce i komunitou. Dnes se podíváme...]]></description>
										<content:encoded><![CDATA[<p>Každá edice SQL Serveru zahrnuje množství uložených a extended procedur, které nejsou zmíněny v oficiální dokumentaci, což znamená především to, že jsou určeny pouze pro interní potřebu Microsoftu a mohou být kdykoliv změněny nebo odstraněny. Přesto je spousta z nich nebývale užitečná a používána široce i komunitou. Dnes se podíváme na některé z nich.<br />
<span id="more-663"></span></p>
<p><strong>sp_Msgetversion</strong></p>
<ul>
<li>vrátí verzi serveru, nahrazeno @@VERSION</li>
</ul>
<p><strong>xp_dirtree</strong></p>
<ul>
<li>vrátí seznam adresářů včetně podadresářů do všech levelů</li>
<li>EXEC master..xp_dirtree ‘C:\’</li>
</ul>
<p><strong>xp_subdirs</strong></p>
<ul>
<li>na rozdíl od xp_dirtree vrací složky pouze do hloubky  = 1</li>
<li>EXEC master..xp_dirtree ‘C:\’</li>
</ul>
<p><strong>xp_enum_oledb_providers</strong></p>
<ul>
<li>zobrazí seznam OLE DB providerů v systému</li>
</ul>
<p><strong>xp_enumcodepages</strong></p>
<ul>
<li>zobrazí seznam kodových stránek serveru</li>
</ul>
<p><strong>xp_enumerrorlogs</strong></p>
<ul>
<li>zobrazí seznam serverových logů</li>
</ul>
<p><strong>xp_enumgroups</strong></p>
<ul>
<li>zobrazí NT skupiny</li>
</ul>
<p><strong>xp_fileexist</strong></p>
<ul>
<li>zjistí, zda soubor existuje</li>
<li>EXEC master..xp_fileexist ‘c:\boot.ini’</li>
</ul>
<p><strong>xp_fixeddrives</strong></p>
<ul>
<li>zobrazí písmeno a velikost systémových disků</li>
</ul>
<p><strong>xp_getnetname</strong></p>
<ul>
<li>zobrazí WINS name SQL serveru</li>
</ul>
<p><strong>xp_readerrorlog</strong></p>
<ul>
<li>přečte aktuální error log</li>
</ul>
<p><strong>xp_regdeletekey</strong></p>
<ul>
<li>vymaže klíč z registru</li>
<li>EXEC master..xp_regdeletekey @rootkey=’HKEY_LOCAL_MACHINE’, @key=’SOFTWARE\Test’</li>
</ul>
<p><strong>xp_regdeletevalue</strong></p>
<ul>
<li>vymaže hodnotu klíče v registru</li>
<li>EXEC master..xp_regdeletevalue @rootkey=’HKEY_LOCAL_MACHINE’, @key=’SOFTWARE\Test’, @value_name=’TestValue’</li>
</ul>
<p><strong>xp_regread</strong></p>
<ul>
<li>přečte hodnotu z registru
<ul>
<li>DECLARE @test varchar(20)<br />
EXEC master..xp_regread @rootkey=’HKEY_LOCAL_MACHINE’, @key=’SOFTWARE\Test’, @value_name=’TestValue’, @value=@test OUTPUTSELECT @test</li>
</ul>
</li>
</ul>
<p><strong>xp_regwrite</strong></p>
<ul>
<li>zapíše hodnotu do registru</li>
<li>EXEC master..xp_regwrite @rootkey=’HKEY_LOCAL_MACHINE’, @key=’SOFTWARE\Test’, @value_name=’TestValue’, @type=’REG_SZ’, @value=’Test’</li>
</ul>
<p><strong>sp_MShasdbaccess</strong></p>
<ul>
<li>vypíše všechny databáze, ke kterým má uživatel přístup</li>
</ul>
]]></content:encoded>
					
					<wfw:commentRss>https://sqlpowered.com/nedokumentovane-ulozene-procedury/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Dočasné uložené procedury</title>
		<link>https://sqlpowered.com/docasne-ulozene-procedury/</link>
					<comments>https://sqlpowered.com/docasne-ulozene-procedury/#respond</comments>
		
		<dc:creator><![CDATA[Jan Dvořák]]></dc:creator>
		<pubDate>Sat, 21 Mar 2015 10:08:01 +0000</pubDate>
				<category><![CDATA[SQL Server]]></category>
		<category><![CDATA[procedures]]></category>
		<guid isPermaLink="false">https://sqlpowered.com/?p=564</guid>

					<description><![CDATA[Že je možné v SQL Serveru vytvářet také dočasné uložené procedury ví opravdu jen málo kdo. Ptám se na to s oblibou při náboru nových kandidátů a 9 z 10 se mne zeptá, že jsem měl zřejmě na mysli dočasné tabulky, případně začnou mluvit rovnou o nich. Tedy ano, opravdu...]]></description>
										<content:encoded><![CDATA[<p>Že je možné v SQL Serveru vytvářet také dočasné uložené procedury ví opravdu jen málo kdo. Ptám se na to s oblibou při náboru nových kandidátů a 9 z 10 se mne zeptá, že jsem měl zřejmě na mysli dočasné tabulky, případně začnou mluvit rovnou o nich. Tedy ano, opravdu můžeme v SQL Serveru vytvářet dočasné uložené procedury, ale měli bychom tak činit jen s dobrou znalostí jejich chování a řídit se doporučeními Microsoftu.</p>
<p>Dočasné uložené procedury (Temporary Stored Procedures) vytváříme stejně jako dočasné tabulky &#8211; přidáme před jejich jméno jeden nebo dva #. Podle toho se rozlišují na lokální a globální podobně jako dočasné tabulky:</p>
<ul>
<li><em>lokální (#)</em>
<ul>
<li>vytváříme je přidáním jednoho hashtagu (#) před jejich název</li>
<li>jsou vidítelné pouze v připojení (SPID) v rámci kterého byly vytvořeny</li>
<li>po zavření připojení jsou automaticky odstraněny</li>
<li>volat je může pouze jejich tvůrce &#8211; vlastník (což je logicky login, kterému patří aktivní připojení)</li>
<li>práva k jejich volání nelze přidělit jiným uživatelům</li>
</ul>
</li>
<li> globální (##)
<ul>
<li>vytváříme je přidání dvou hashtagů (##) před jejich název</li>
<li>jsou viditelné pro všechna připojení (SPIDs) dané instance</li>
<li>jsou odstraněny automaticky po uzavření posledního připojení, které je používalo</li>
<li>mohou je volat všichni uživatelé a toto právo není možné odebrat</li>
</ul>
</li>
</ul>
<p>Dočasné uložené procedury mohou vytvářet všichni uživatelné a toto právo nelze odebrat.</p>
<p>Příklad jednoduché lokální uložené procedury může vypadat například takto:</p>
<pre class="lang:tsql decode:true">CREATE PROCEDURE #PrintMessageUpperCase (
	@Msg NVARCHAR(100)
)
AS
BEGIN
    
     PRINT UPPER(@Msg)

END
GO

EXECUTE [dbo].[#PrintMessageUpperCase] @Msg = N'Test Message'
GO

DROP PROCEDURE [dbo].[#PrintMessageUpperCase]
GO</pre>
<p><img decoding="async" class="alignnone size-full wp-image-3085" src="https://sqlpowered.com/wp-content/uploads/2015/03/Temporary_Stored_Procedures_1.png" alt="" width="120" height="43" /></p>
<p>Opravdu užitečné je použití dočasný uložených procedur v nejrůznějších scénářích nasazování databázových změn, kdy potřebujeme spouštět složitější skripty, případně dosáhnout žádoucího chování SQL Serveru tím, že kód obalíme uloženou procedurou. Stejně tak se výborně hodí pro testování různých optimalizací atd. Na konci nemusíme řešit čistění databáze od dočasných objektů.</p>
<p>Na co je třeba opravdu dávat pozor je bezpečnost: ke globálním dočasným uloženým procedurám nelze omezit právo EXECUTE a z jiné session tak může být spuštěn kód, ke kterému by se za normálních okolností uživatel nedostal.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://sqlpowered.com/docasne-ulozene-procedury/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
