<?xml version="1.0" encoding="UTF-8" ?><oembed><version>1.0</version><provider_name>Чудо{вищные} заметки</provider_name><provider_url>https://miracle.rpz.name</provider_url><author_name>MiRacLe</author_name><author_url>https://miracle.rpz.name/author/miracle/</author_url><title>NULL без палочки</title><html>&lt;p&gt;Второй раз сталкиваюсь с неспортивным поведением со стороны MSSQL. И дабы встретив третий не тратить на него полдня документирую.&lt;/p&gt;
&lt;em&gt;Имеется:&lt;/em&gt;&lt;br /&gt;
&lt;ol&gt;
    &lt;li&gt;два &lt;strong&gt;слинкованных MSSQL-сервера&lt;/strong&gt;&lt;/li&gt;
    &lt;li&gt;подключение к одному из них&lt;/li&gt;
    &lt;li&gt;хранимая процедура на другом&lt;/li&gt;
&lt;/ol&gt;
&lt;em&gt;Требуется:&lt;/em&gt;&lt;br /&gt;
&lt;ul&gt;
    &lt;li&gt;вызвать эту процедуру c набором параметров и получить результат.&lt;/li&gt;
&lt;/ul&gt;
&lt;em&gt;Решение:&lt;/em&gt;&lt;br /&gt;
&lt;blockquote&gt;exec LINKED_SERVER.SELECTED_DATABASE.dbo.procedure_&lt;span&gt;name @param_2=value, @param_1=value, @param_3=value…&lt;/span&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;strike&gt;Ничего не предвещает беды. Небо чистое, коннект уверенный, лаг умеренный… и тут... растёт напряжение, давит тишина, в жилах стынет кровь и появляется леденящий душу ПИЗДЕЦ!&lt;/strike&gt;&lt;/p&gt;
&lt;p&gt;Я не случайно параметры написал &quot;вразнобой&quot;. Казалось бы ничего криминального - они же именованы. И всё отлично покуда все параметры принимают какие-либо значения. Но как только окажется что &lt;em&gt;@param_2=null&lt;/em&gt; (или @param_1) вы будете приятно удивлены загадочными сообщениями вроде &quot;а почему это параметр_2 не передан?&quot; или &quot;зачем параметр_1 ты передал мне два раза?&quot;. И будете долго  биться в истерике, когда окажется, что выполняя запрос сразу на нужном сервере, вы получаете нормальный результат без каких-либо сообщений об ошибках. Мистика?&lt;/p&gt;
&lt;p&gt;Как удалось выяснить - параметр, который null на линкованный сервер попадает уже без имени (т.е. не &lt;em&gt;&quot;@param_2=null,  @param_1=value, @param_2=value&quot;&lt;/em&gt;, a &lt;strong&gt;&quot;NULL, @param_1=value, @param_3=value&quot;&lt;/strong&gt; и как следствие - этот самый NULL в данном случае будет считаться первым входным параметром в процедуре…&lt;/p&gt;
&lt;p&gt;Решение было тривиальным(и глупым) - вынести все параметры, которые могут быть &lt;strong&gt;null&lt;/strong&gt;, в конец объявления. Но если кто-то объяснит суть описываемого явления, и красивый выход из такого положения -  буду очень признателен.&lt;/p&gt;</html><type>rich</type></oembed>