Consulte esta pergunta no SO porque é semelhante.
Estou trabalhando em uma maneira de excluir um intervalo de datas de todas as tabelas com valores de data em um banco de dados (finalidade para criar mini-devs). Eu construí um script que permite ao usuário passar os valores de início, fim e banco de dados, mas estou tendo problemas com o sql dinâmico. Por exemplo, ao remover registros entre determinadas datas, recebo um conflito de operandos. O exemplo abaixo mostra um exemplo simplificado disso:
DECLARE @b DATE, @e DATE, @cmd NVARCHAR(MAX)
SET @b = '2012-07-01'
SET @e = '2014-01-25'
SET @cmd = 'DELETE FROM DateTable
WHERE ValueDate BETWEEN ' + CONVERT(VARCHAR,@b,121) + ' AND ' + CONVERT(VARCHAR,@E,121)
EXEC sp_executesql @cmd
O erro é Operand type clash: date is incompatible with int
. Tentei fazer um inner CAST
dentro do sql dinâmico pois o erro indica que o ValueDate
torna-se e INT
:
-- Only the WHERE clause changed:
WHERE ValueDate BETWEEN CAST(' + CONVERT(VARCHAR,@b,121) + ' AS DATE) AND CAST(' + CONVERT(VARCHAR,@E,121) + ' AS DATE)'
O erro desta vez é Explicit conversion from data type int to date is not allowed
. Finalmente tentei jogar com alguns outros formatos ( do MSDN ). Em poucas palavras, quero fazer exatamente o que o usuário do SO estava tentando realizar, mas ser capaz de fazê-lo em várias tabelas ( até procurei um script , pois duvido que seja a primeira pessoa a querer isso).
Você deve tentar imprimir seus comandos quando eles gerarem erros. Se você emitiu isso em vez de executá-lo:
Você veria isso:
Rende isso:
O que, uma vez que eles parecem ao SQL Server como três números inteiros com alguns operadores de subtração, torna-se:
O que nem é uma
BETWEEN
operação válida, mesmo que pudesse traduzi-los em datas.O que você deve fazer é passar isso como parâmetros apropriados, por exemplo
Se alguma dessas colunas for
DATETIME
, nãoDATE
, você realmente não deveria estar usandoBETWEEN
. Em vez de:Por favor leia:
Quanto ao requisito geral de repetir esta consulta em todas as colunas de data no banco de dados, aqui está como eu faria (examinei a pergunta SO que você referenciou e mostra apenas como fazer isso para uma tabela):