<?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>kocherov.net &#187; tsql</title>
	<atom:link href="https://kocherov.net/tag/tsql/feed/" rel="self" type="application/rss+xml" />
	<link>https://kocherov.net</link>
	<description>создание и поддержка парсеров, систем сбора и анализа информации</description>
	<lastBuildDate>Thu, 19 Feb 2026 13:03:25 +0000</lastBuildDate>
	<language>ru-RU</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.6.1</generator>
		<item>
		<title>MSSQL, TSQL, динамический SQL, динамическое формирование запросов</title>
		<link>https://kocherov.net/mssql-tsql-dinamicheskiy-sql-dinamicheskoe-formirovanie-zaprosov/</link>
		<comments>https://kocherov.net/mssql-tsql-dinamicheskiy-sql-dinamicheskoe-formirovanie-zaprosov/#comments</comments>
		<pubDate>Wed, 20 Feb 2013 11:18:24 +0000</pubDate>
		<dc:creator>Pavel Kocherov</dc:creator>
				<category><![CDATA[Работа]]></category>
		<category><![CDATA[mssql]]></category>
		<category><![CDATA[sql]]></category>
		<category><![CDATA[tsql]]></category>

		<guid isPermaLink="false">http://kocherov.net/?p=203</guid>
		<description><![CDATA[Задача: в stored procedure динамически формировать SQL для получения данных. Динамическими должны быть все части: названия таблиц, количество условий, названия колонок. В идеале нужно просто составлять строку, а потом выполнять запрос из нее, при этом вообще хорошо, если удастся обеспечить параметризацию. Решение: использование sp_executesql Сразу на примере, ситуация. Пусть у нас есть несколько сущностей в [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Задача: в stored procedure динамически формировать SQL для получения данных. Динамическими должны быть все части: названия таблиц, количество условий, названия колонок. В идеале нужно просто составлять строку, а потом выполнять запрос из нее, при этом вообще хорошо, если удастся обеспечить параметризацию.</p>
<p>Решение: использование sp_executesql<br />
Сразу на примере, ситуация.</p>
<p>Пусть у нас есть несколько сущностей в системе. Есть пользователи, есть записи в блоге, есть статьи.<br />
Все они хранятся в трех разных таблицах account, blog_post, content_page (primary keys: account_id, blog_post_id, content_page_id).<br />
В каждой из этих таблиц есть, соответственно, поля acc_created, bp_created, cp_created. И представьте теперь, что в одной из sp нам необходимо за заданному id и типу сущности получить creation date. Можно написать 3 запроса &#8212; легко, ну а если сущностей, скажем, 50? Тогда простое решение становится уж очень некрасивым.</p>
<p>На помощь приходит динамический sql.<br />
<strong>Attention. Я знаю про перфоманс и про все остальное, я знаю что 50 отдельных запросов будут быстрее. Речь не об этом, а о ситуации, когда принято решение, что делать нужно так.</strong></p>
<pre class="brush: sql; title: ; notranslate">
set @sql =     N'select @created =  ' + @pspAbbrev + '_created from ' + @pspFull + ' where ' + @pspFull + '_ID = @id;';

set @params =  N'@id     integer, ' +
	       N'@created   datetime OUTPUT';
			   
exec sp_executesql @sql, @params, @id = @id, @created = @created OUTPUT
</pre>
<p>Прежде всего, нам необходимо определить @pspAbbrev (например, &#8216;usr&#8217;) и @pspFull(например, &#8216;user&#8217;).<br />
После чего сформировать @sql, определить input-output параметры, вызвать sp_executesql и далее пользоваться полученным значением из переменной @created.</p>
]]></content:encoded>
			<wfw:commentRss>https://kocherov.net/mssql-tsql-dinamicheskiy-sql-dinamicheskoe-formirovanie-zaprosov/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
