Imprimir a declaração em T-SQL

porque é que a declaração de impressão em T-SQL parece funcionar apenas às vezes? Quais são as restrições em usá-lo? Parece que, às vezes, se um conjunto de resultados é gerado, ele se torna uma função nula, eu assumi para evitar corromper o conjunto de resultados, mas poderia ser a saída não sair em outro conjunto de resultados, como a contagem de linhas?

Author: ProfK, 2008-11-06

6 answers

Então, se tem uma declaração como a seguinte, está a dizer que não tem resultado de impressão?
select * from sysobjects
PRINT 'Just selected * from sysobjects'

Se estiver a usar o analisador de consultas SQL, verá que existem duas páginas no fundo, uma das quais é" Mensagens " e é aí que as declarações 'imprimir' irão aparecer.
Se você está preocupado com o tempo de ver as declarações de impressão, você pode querer tentar usar algo como

raiserror ('My Print Statement', 10,1) with nowait
Isto dar-lhe-á a mensagem imediatamente como ... a instrução é alcançada, ao invés de buffering a saída, como o analisador de consulta vai fazer sob a maioria das condições.
 89
Author: David T. Macknet, 2008-11-06 11:58:47

A declaração de impressão em TSQL é uma criatura incompreendida, provavelmente por causa do seu nome. Na verdade, envia uma mensagem para o mecanismo de tratamento de erros/mensagens que, em seguida, transfere-o para a aplicação chamadora. A impressão digital é muito burra. Você só pode enviar 8000 caracteres (4000 caracteres unicode). Você pode enviar uma string literal, uma variável de string (varchar ou char) ou uma expressão de string. Se você usar RAISERROR, então você está limitado a uma cadeia de apenas 2,044 caracteres. No entanto, é muito mais fácil para usá-lo para enviar informações para o aplicativo de chamada, uma vez que ele chama uma função de formatação semelhante ao printf antigo na biblioteca padrão C. RAISERROR também pode especificar um número de erro, uma gravidade e um código de Estado, além da mensagem de texto, e também pode ser usado para retornar mensagens definidas pelo usuário criadas usando o procedimento de armazenamento do sistema sp_addmessage. Você também pode forçar as mensagens a serem registradas.

As suas rotinas de tratamento de erros não servirão para receber mensagens., apesar das mensagens e erros serem tão semelhantes. A técnica varia, naturalmente, de acordo com a maneira real que você se conecta ao banco de dados (OLBC, OLEDB etc). A fim de receber e lidar com as mensagens do motor de banco de Dados SQL Server, quando você está usando o sistema.Dado.SQLClient, você precisará criar um SqlInfoMessageEventHandler delegado, identificando o método que lida com o evento, para ouvir o evento de InfoMessage na classe SqlConnection. Você vai encontrar essa mensagem-Informações de contexto tais como a gravidade e o estado são passados como argumentos para o callback, porque da perspectiva do sistema, estas mensagens são apenas como erros.

É sempre uma boa ideia ter uma forma de obter estas mensagens na sua aplicação, mesmo que esteja apenas a spooling para um ficheiro, porque vai haver sempre um uso para eles quando está a tentar perseguir um problema realmente obscuro. No entanto, acho que não quero que os utilizadores finais os vejam a menos que se possa reservar um nível de informação. isso mostra coisas na aplicação.

 35
Author: , 2008-11-06 19:40:20

Mensagens do analisador de pesquisas. As declarações PRINT e RAISERROR usam este buffer, mas a declaração RAISERROR tem uma opção com NOWAIT. Para imprimir uma mensagem imediatamente use o seguinte:

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

O RAISERROR só irá mostrar 400 caracteres da sua mensagem e usa uma sintaxe semelhante à função C printf para formatar o texto.

Por favor, note que o uso do RAISERROR com a opção com o NOWAIT irá limpar o buffer de mensagens, de modo que todos os buffer anteriores a informação será saída também.

 22
Author: JimCarden, 2010-05-28 12:39:31
Encontrei isto recentemente, e acabou por ser porque tinha uma declaração convertida numa variável nula. Uma vez que isso estava causando erros, toda a declaração de impressão estava tornando-se nulo, e não imprimir de todo. Exemplo-isto falhará:
declare @myID int=null
print 'First Statement: ' + convert(varchar(4), @myID)
Exemplo-isto irá imprimir:
declare @myID int=null
print 'Second Statement: ' +  coalesce(Convert(varchar(4), @myID),'@myID is null')
 18
Author: WEFX, 2016-12-28 15:14:32

Para o benefício de qualquer outra pessoa que leia esta pergunta que realmente está faltando declarações de impressão de sua saída, há realmente casos em que a impressão executa, mas não é devolvido ao cliente. Não te posso dizer especificamente o que são. Posso dizer-lhe que se colocar uma declaração go imediatamente antes e depois de qualquer declaração de impressão, você vai vê-la se for executada.

 3
Author: JohnOpincar, 2010-03-30 20:51:22

Tem variáveis que estão associadas a estas declarações de impressão? se assim for, descobri que se a variável não tiver valor, então a declaração de impressão não será ouput.

 0
Author: user2574678, 2013-07-19 19:51:12