Оператор PRINT в T-SQL - PullRequest
       46

Оператор PRINT в T-SQL

67 голосов
/ 06 ноября 2008

Почему оператор PRINT в T-SQL работает только иногда? Каковы ограничения на его использование? Иногда создается впечатление, что если набор результатов сгенерирован, он становится пустой функцией, я предположил, что это не повредит набор результатов, но может ли его вывод не выйти в другой набор результатов, например, в число строк?

Ответы [ 6 ]

94 голосов
/ 06 ноября 2008

Итак, если у вас есть утверждение, похожее на следующее, вы говорите, что не получите результат «печати»?

select * from sysobjects
PRINT 'Just selected * from sysobjects'

Если вы используете SQL Query Analyzer, вы увидите, что внизу есть две вкладки, одна из которых - «Сообщения», и там будут отображаться операторы «печати».
Если вы беспокоитесь о времени просмотра операторов печати, вы можете попробовать использовать что-то вроде

raiserror ('My Print Statement', 10,1) with nowait

Это даст вам сообщение сразу после достижения оператора, а не буферизует вывод, как это сделает анализатор запросов при большинстве условий.

36 голосов
/ 06 ноября 2008

Оператор Print в TSQL является неправильно понятым существом, вероятно, из-за его имени. Фактически он отправляет сообщение механизму обработки ошибок / сообщений, который затем передает его вызывающему приложению. ПРИНТ довольно тупой. Вы можете отправить только 8000 символов (4000 символов Юникода). Вы можете отправить буквальную строку, строковую переменную (varchar или char) или строковое выражение. Если вы используете RAISERROR, то вы ограничены строкой из 2044 символов. Однако его гораздо проще использовать для отправки информации вызывающему приложению, поскольку он вызывает функцию форматирования, аналогичную старому printf в стандартной библиотеке C. RAISERROR может также указывать номер ошибки, серьезность и код состояния в дополнение к текстовому сообщению, а также может использоваться для возврата пользовательских сообщений, созданных с использованием системной хранимой процедуры sp_addmessage. Вы также можете принудительно регистрировать сообщения.

Ваши процедуры обработки ошибок не будут полезны для приема сообщений, несмотря на то, что сообщения и ошибки очень похожи. Техника, конечно, варьируется в зависимости от способа подключения к базе данных (OLBC, OLEDB и т. Д.). Чтобы получать и обрабатывать сообщения от компонента SQL Server Database Engine, при использовании System.Data.SQLClient вам необходимо создать делегат SqlInfoMessageEventHandler, определяющий метод, который обрабатывает событие, для прослушивания события InfoMessage. в классе SqlConnection. Вы обнаружите, что информация контекста сообщения, такая как серьезность и состояние, передается в качестве аргументов для обратного вызова, поскольку с точки зрения системы эти сообщения аналогичны ошибкам.

Это всегда хорошая идея, чтобы иметь возможность получать эти сообщения в вашем приложении, даже если вы просто буферизуете в файл, потому что они всегда будут полезны, когда вы пытаетесь преследовать действительно неясная проблема. Однако я не могу думать, что хочу, чтобы конечные пользователи когда-либо видели их, если вы не можете зарезервировать информационный уровень, который отображает данные в приложении.

25 голосов
/ 28 мая 2010

Query Analyzer буферизует сообщения. Оба оператора PRINT и RAISERROR используют этот буфер, но оператор RAISERROR имеет параметр WITH NOWAIT. Для печати сообщения сразу используйте следующее:

RAISERROR ('Your message', 0, 1) WITH NOWAIT

RAISERROR будет отображать только 400 символов вашего сообщения и использует синтаксис, аналогичный функции C printf для форматирования текста.

Обратите внимание, что использование RAISERROR с параметром WITH NOWAIT очистит буфер сообщений, поэтому будет также выводиться вся ранее буферизованная информация.

20 голосов
/ 22 июня 2012

Я недавно столкнулся с этим, и все закончилось тем, что у меня был оператор convert для пустой переменной. Так как это приводило к ошибкам, весь оператор print отображался как ноль, а не печатался вообще.

Пример - это не удастся:

declare @myID int=null
print 'First Statement: ' + convert(varchar(4), @myID)

Пример - будет напечатано:

declare @myID int=null
print 'Second Statement: ' +  coalesce(Convert(varchar(4), @myID),'@myID is null')
3 голосов
/ 31 марта 2010

В интересах любого, кто читает этот вопрос, если в его выводе действительно отсутствуют операторы печати, на самом деле существуют случаи, когда печать выполняется, но не возвращается клиенту. Я не могу сказать вам конкретно, кто они. Я могу вам сказать, что если поместить оператор go непосредственно перед и после любого оператора print, вы увидите его, если он будет выполнен.

0 голосов
/ 19 июля 2013

У вас есть переменные, которые связаны с этими инструкциями печати были выведены? в таком случае я обнаружил, что если переменная не имеет значения, оператор print не будет выводиться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...