sql-server — Оператор PRINT в T-SQL" />

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

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

65 голосов | спросил ProfK 6 42008vEurope/Moscow11bEurope/MoscowThu, 06 Nov 2008 14:43:09 +0300 2008, 14:43:09

6 ответов


0

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

select * from sysobjects
ПЕЧАТЬ 'Только что выбрано * из системных объектов'

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

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

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

ответил David T. Macknet 6 42008vEurope/Moscow11bEurope/MoscowThu, 06 Nov 2008 14:58:47 +0300 2008, 14:58:47
0

Оператор 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. Вы обнаружите, что информация контекста сообщения, такая как серьезность и состояние, передается в качестве аргументов обратному вызову, потому что с точки зрения системы эти сообщения похожи на ошибки.

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

ответил 6 42008vEurope/Moscow11bEurope/MoscowThu, 06 Nov 2008 22:40:20 +0300 2008, 22:40:20
0

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

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

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

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

ответил JimCarden 28 Maypm10 2010, 16:39:31
0

Я недавно столкнулся с этим, и это закончилось тем, что у меня был оператор 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')
ответил WEFX 22 J0000006Europe/Moscow 2012, 23:24:30
0

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

ответил JohnOpincar 31 MaramWed, 31 Mar 2010 00:51:22 +04002010-03-31T00:51:22+04:0012 2010, 00:51:22
0

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

ответил user2574678 19 J000000Friday13 2013, 23:51:12

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132