Насколько я понимаю, столбец BBH_NEW.rebate2 имеет тип money
, когда вы получаете сообщение об ошибке.В T-SQL у вас не может быть запроса, который не компилируется, и это то, с чем вы сталкиваетесь.Даже если запрос в блоке Always-false if не будет выполнен, он не будет скомпилирован, потому что типы данных не совпадают.
Во-первых, быстрое решение для вас - используйте CONVERT или CAST, чтобы явноизмените тип данных.
if 'money'!= 'money'
begin
IF NOT EXISTS (SELECT top 1 * FROM [BBH_NEW] WHERE [rebate2] IS NOT NULL and
len(CONVERT(VARCHAR(8000), [rebate2])) > 0 )
BEGIN
print ' rebate2 '
end
end
Но должен быть лучший способ делать то, что вы делаете ... Когда генерируется этот SQL?Если это во время выполнения, можете ли вы просто не генерировать часть, которая не будет работать?Может быть, что-то вроде этого?
SELECT @hold = CASE WHEN @temp = 'money' THEN
'if (select max(['+@col+']) from ['+@tblname+']) = 0
and (select min(['+@col+']) from ['+@tblname+']) = 0
print '' '+@col+' money'''
ELSE
'IF NOT EXISTS (SELECT max([' + @col + ']) FROM ['+ @tblname + ']
WHERE len( [' + @col + ']) > 0 )
BEGIN
print '' ' + @col + ' ''
end'
END
или, может быть, сменить поколение на это ...
SELECT @temp = DATA_TYPE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = 'dbo'
AND TABLE_NAME = @tblname
AND COLUMN_NAME = @col
IF(@temp = 'money')
SELECT @hold = 'IF(EXISTS(
SELECT 1
FROM ['+@tblname+']
HAVING MAX(['+@col+']) = 0
AND MIN(['+@col+']) = 0))
BEGIN
PRINT '' '+@col+' ''
END';
ELSE
SELECT @hold = 'IF(NOT EXISTS(
SELECT *
FROM ['+@tblname+']
WHERE ['+@col+'] IS NOT NULL
AND LEN(['+@col+']) > 0))
BEGIN
PRINT '' '+@col+' ''
END';