Почему оператор PRINT в T-SQL, по-видимому, работает только иногда? Каковы ограничения на его использование? Кажется, что если создается набор результатов, он становится нулевой функцией, я предполагаю, что это предотвращает повреждение набора результатов, но может ли он выводиться не в другом результирующем наборе, например в счетчике строк?
Оператор PRINT в T-SQL
Ответ 1
Итак, если у вас есть что-то вроде следующего, вы говорите, что у вас нет результата "print"?
select * from sysobjects PRINT 'Just selected * from sysobjects'
Если вы используете SQL Query Analyzer, вы увидите, что внизу внизу есть две вкладки, одна из которых - "Сообщения" и что там будут отображаться утверждения "print".
Если вы беспокоитесь о timing для просмотра операторов печати, вы можете попробовать использовать что-то вроде
raiserror ('My Print Statement', 10,1) with nowait
Это даст вам сообщение сразу, как только оператор будет создан, а не буферизует вывод, поскольку Query Analyzer будет работать в большинстве условий.
Ответ 2
Заявление о печати в TSQL - это неправильно понятое существо, возможно, из-за его имени. Он фактически отправляет сообщение в механизм обработки ошибок/сообщений, который затем передает его вызывающему приложению. PRINT довольно тупой. Вы можете отправлять только 8000 символов (4000 символов Unicode). Вы можете отправить литеральную строку, строковую переменную (varchar или char) или строковое выражение. Если вы используете RAISERROR, тогда вы ограничены строкой всего 2044 символа. Тем не менее, гораздо проще использовать его для отправки информации вызывающему приложению, поскольку она вызывает функцию форматирования, аналогичную старой printf в стандартной библиотеке C. RAISERROR также может указывать номер ошибки, серьезность и код состояния в дополнение к текстовому сообщению, а также может использоваться для возврата пользовательских сообщений, созданных с использованием хранимой процедуры системы sp_addmessage. Вы также можете принудительно регистрировать сообщения.
Ваши процедуры обработки ошибок не будут хороши для получения сообщений, несмотря на то, что сообщения и ошибки настолько похожи. Разумеется, этот метод зависит от того, как вы подключаетесь к базе данных (OLBC, OLEDB и т.д.). Чтобы получать и обрабатывать сообщения из SQL Server Database Engine, когда вы используете System.Data.SQLClient, вам нужно создать делегат SqlInfoMessageEventHandler, идентифицирующий метод, который обрабатывает событие, для прослушивания события InfoMessage в классе SqlConnection, Вы обнаружите, что информация о контексте сообщения, такая как степень серьезности и состояние, передается в качестве аргументов для обратного вызова, потому что с точки зрения системы эти сообщения похожи на ошибки.
Всегда полезно иметь способ получить эти сообщения в своем приложении, даже если вы просто буферизируете в файл, потому что всегда будет полезно для них, когда вы пытаетесь преследовать действительно непонятная проблема. Тем не менее, я не могу думать, что Id хочет, чтобы конечные пользователи когда-либо видели их, если вы не можете зарезервировать информационный уровень, отображающий материал в приложении.
Ответ 3
Query Analyzer буферизует сообщения. Операторы PRINT и RAISERROR используют этот буфер, но оператор RAISERROR имеет параметр WITH NOWAIT. Чтобы немедленно распечатать сообщение, используйте следующее:
RAISERROR ('Your message', 0, 1) WITH NOWAIT
RAISERROR будет отображать только 400 символов вашего сообщения и использует синтаксис, аналогичный функции printf для C, для форматирования текста.
Обратите внимание, что использование RAISERROR с опцией WITH NOWAIT очистит буфер сообщений, поэтому также будет выведена вся ранее буферизованная информация.
Ответ 4
Недавно я столкнулся с этим, и это закончилось тем, что у меня был оператор конверсии для нулевой переменной. Так как это вызывало ошибки, весь оператор печати был рендерингом как 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')
Ответ 5
В интересах кого-либо, кто читает этот вопрос, который действительно пропускает инструкции печати из их вывода, на самом деле есть случаи, когда печать выполняется, но не возвращается клиенту. Я не могу точно сказать, что это такое. Я могу сказать вам, что если поставить инструкцию go непосредственно перед и после любого оператора печати, вы увидите его, если оно выполнено.
Ответ 6
У вас есть переменные, связанные с этими операциями печати? если это так, я обнаружил, что если переменная не имеет значения, то оператор печати не будет выходить.
Ответ 7
Я только что это произошло. Моя проблема заключалась в том, что у меня была переменная date внутри моей строковой переменной. Когда я пошел печатать строку, она не печатала и не выдавала сообщение об ошибке.
Я по существу передал переменную date в строку в моей строковой переменной. Затем он отлично печатает!