Estou tentando configurar uma consulta, para que ele compare duas datas de duas tabelas diferentes e, se forem iguais, a consulta será encerrada. Se eles não forem iguais, a consulta continuará e inserirá algumas coisas. Eu não consigo descobrir como fazê-lo fazer o que eu quero, no entanto.
SELECT TOP(1) @dateA=a.someDate
FROM a
ORDER BY DESC;
SELECT TOP(1) @dateB=b.someDate
FROM b
ORDER BY DESC;
CASE WHEN @dateA=@dateB THEN raiseerror('dates equal',20,-1) with log;
Insert statements;
Qualquer ajuda seria super apreciada.
sql-server
t-sql
thejoker34
fonte
fonte
CASE
- SQL Server possui apenas aCASE
expressão.Respostas:
CASE
é uma expressão (não uma instrução) e não pode ser usada para controle de fluxo como esse - não para chamar comandos, não para retornar mais de uma coluna / valor, não para ser usado como um comando por si só.Parece-me que você pode usar apenas
IF
para aumentar o erro quando as datas são iguais; caso contrário, execute as inserções.Você também pode fazer o contrário. Execute as inserções apenas se as datas não forem iguais ; caso contrário, aumente o erro:
Se você pensou em usar o erro apenas com o objetivo de deixar de executar as inserções, basta remover tudo da parte
ELSE
inferior, pois a única maneira de as inserções funcionarem é quando@dateA
e não@dateB
são iguais :Voltei a ser pedante sobre coisas como linhas (vs. "registros") e colunas (vs. "campos"), mas toda a expressão vs. declaração é uma distinção muito importante, exatamente por esse motivo. Consulte " Segredos sujos da expressão CASE ".
fonte
NULL
. Ainda é uma boa observação que as duas versões que Aaron fornece farão coisas diferentes nesse caso.Use um em
IF
vez de umCASE
Obviamente, isso pressupõe que você realmente deseja gerar um erro. A outra opção seria:
Agora, observe oe
BEGIN
oEND
. Isso vai ser importante. aIF
declaração (e aELSE
) afeta apenas o comando logo abaixo dela. Se você precisar de mais de um comando, precisará de um BEGIN e um END .fonte
Outras respostas apontaram que o CASE é uma expressão , não uma afirmação e, portanto, não pode, por si só, abranger afirmações (como
RAISEERROR
qualquer outra). Se as condições não forem muitas - principalmente quando é apenas uma condição -, a instrução SE é a escolha perfeita para o que você está tentando fazer, como também foi mencionado.No entanto, dependendo do seu cenário, uma expressão CASE ainda pode ser usada, mas não exatamente da maneira que você mostrou. Em particular, se houver muitas condições a serem verificadas em que uma correspondência deve resultar no mesmo conjunto de ações (por exemplo, gerar uma exceção e encerrar o script), você poderá usar uma expressão CASE em uma instrução de atribuição que armazene o resultado do CASE e siga com um FI verificando o resultado armazenado e executando as ações necessárias, se apropriado, da seguinte maneira:
Nesse caso, a ação necessária está gerando uma exceção, mas a mensagem retornada com a exceção precisa depender de qual condição foi verificada primeiro. A instrução de atribuição usa uma expressão CASE para escolher qual mensagem armazenar na
@ErrorMessage
variável.Você também pode ver que o erro é gerado apenas condicionalmente - somente se a variável realmente contiver uma mensagem para mostrar. Se o valor for uma sequência vazia ou nula, o script continuará sem interrupção.
fonte
Você precisa das variáveis?
fonte