Оператор печати в T-SQL
Почему оператор PRINT в T-SQL, похоже, работает только иногда? Каковы ограничения на его использование? Кажется, иногда, если результирующий набор генерируется, он становится нулевой функцией, я предположил, чтобы предотвратить повреждение результирующего набора, но может ли он выводиться не в другом результирующем наборе, таком как счетчик строк?
6 ответов:
Итак, если у вас есть заявление что-то вроде следующего, вы говорите, что вы не получаете "печать" результат?
select * from sysobjects PRINT 'Just selected * from sysobjects'Если вы используете SQL Query Analyzer, вы увидите, что внизу есть две вкладки, одна из которых "сообщения", и именно там будут отображаться инструкции "print".
Если вы беспокоитесь о времени видя инструкции печати, вы можете попробовать использовать что-то вродеraiserror ('My Print Statement', 10,1) with nowaitэто даст вам сообщение сразу же по достижении оператора, а не буферизация вывода, Как это будет делать анализатор запросов при большинстве условий.
оператор печати в TSQL является неправильно понятым существом, вероятно, из-за его имени. Он фактически отправляет сообщение механизму обработки ошибок / сообщений, который затем передает его вызывающему приложению. Печать довольно тупая. Вы можете отправить только 8000 символов (4000 символов Юникода). Вы можете отправить строковый литерал, переменная string (varchar или char) или строковое выражение. Если вы используете RAISERROR, то вы ограничены строкой всего из 2044 символов. Тем не менее, это гораздо проще используйте его для отправки информации в вызывающее приложение, поскольку он вызывает функцию форматирования, аналогичную старой printf в стандартной библиотеке C. RAISERROR также может указывать номер ошибки, серьезность и код состояния в дополнение к текстовому сообщению, а также может использоваться для возврата пользовательских сообщений, созданных с помощью системной хранимой процедуры sp_addmessage. Вы также можете принудительно регистрировать сообщения.
ваши процедуры обработки ошибок не будут хороши для получения сообщений, несмотря на то, что сообщения и ошибки так похожи. Техника варьируется, конечно, в зависимости от фактического способа подключения к базе данных (OLBC, OLEDB и т. д.). Для того, чтобы получать и обрабатывать сообщения от SQL Server Database Engine, когда вы используете систему.Данные.SQLClient, вам нужно будет создать делегат sqlinfomessageeventhandler, определяющий метод, который обрабатывает событие, чтобы прослушать событие InfoMessage в классе SqlConnection. Вы найдете эту информацию о контексте сообщения такие как серьезность и состояние передаются в качестве аргументов обратного вызова, потому что с точки зрения системы эти сообщения похожи на ошибки.
Это всегда хорошая идея, чтобы иметь способ получения этих сообщений в вашем приложении, даже если вы не просто перенаправляет в файл, потому что всегда будет использовать их, когда вы пытаетесь гнаться за очень непонятную проблему. Тем не менее, я не могу думать, что хочу, чтобы конечные пользователи когда-либо видели их, если вы не можете зарезервировать информацию уровень, который отображает материал в приложении.
анализатор запросов буферизует сообщения. Операторы PRINT и RAISERROR используют этот буфер, но оператор RAISERROR имеет параметр WITH NOWAIT. Для печати сообщения немедленно используйте следующее:
RAISERROR ('Your message', 0, 1) WITH NOWAITRAISERROR будет отображать только 400 символов Вашего сообщения и использует синтаксис, аналогичный функции C printf для форматирования текста.
обратите внимание, что использование RAISERROR с опцией WITH NOWAIT приведет к очистке буфера сообщений, поэтому все ранее также будет выведена буферизованная информация.
Я недавно столкнулся с этим, и это закончилось тем, что у меня был оператор convert для нулевой переменной. Поскольку это вызывало ошибки, весь оператор печати отображался как null, а не печать вообще.
пример - это плохо:
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')
в интересах всех, кто читает этот вопрос, который действительно отсутствует в операторах печати из их вывода, на самом деле есть случаи, когда печать выполняется, но не возвращается клиенту. Я не могу сказать вам конкретно, что это такое. Я могу сказать вам, что если поставить оператор go непосредственно перед и после любого оператора печати, вы увидите его, если он будет выполнен.
есть ли у вас переменные, которые связаны с этими операторами печати были выведены? если это так, я обнаружил, что если переменная не имеет значения, то оператор print не будет выводиться.
Comments