SQL Server условия - PullRequest
       7

SQL Server условия

0 голосов
/ 26 февраля 2010

При выполнении этого запроса я получаю сообщение об ошибке, поскольку тип данных money не может быть неявно преобразован в varchar Тем не менее, я использую if statemnt, чтобы убедиться, что тип данных не деньги, прежде чем я попробую преобразование. Очевидно, что преобразование выполняется в любом случае. Кто-нибудь знает почему?

таблица: BBH_NEW col: rebate2
тип данных: деньги

if 'money'= 'money'
begin
   if (select max([rebate2]) from [BBH_NEW]) = 0 
   and (select min([rebate2]) from [BBH_NEW]) = 0
     print ' rebate2 '
     print ' 1 '
end   

if 'money'!= 'money'
begin
   IF NOT EXISTS (SELECT top 1 * FROM [BBH_NEW] WHERE [rebate2] IS NOT NULL and
   len([rebate2]) > 0 ) 
   BEGIN 
      print ' rebate2 ' 
   end
end

Ошибка:
Сообщение 257, уровень 16, состояние 3, строка 11
Неявное преобразование из типа данных money в varchar не допускается. Используйте функцию CONVERT для выполнения этого запроса.


да, этот код был сгенерирован. Если это помогает, это код, который использовался для его создания:

select @temp = 
    data_type FROM information_schema.columns
WHERE table_schema = 'dbo'
AND table_name = @tblname 
AND column_name = @col

SELECT @hold = 
    'if '''+@temp+'''= ''money'' 
begin
   if (select max(['+@col+']) from ['+@tblname+']) = 0 
       and (select min(['+@col+']) from ['+@tblname+']) = 0
   print '' '+@col+' money''
end 

    if '''+@temp+'''!= ''money'' 
begin
   IF NOT EXISTS (SELECT max([' + @col + ']) FROM ['+ @tblname + '] 
       WHERE len( [' + @col + ']) > 0 ) 
       BEGIN 
          print '' ' + @col + ' '' 
       end 
end'

Ответы [ 2 ]

2 голосов
/ 27 февраля 2010

Насколько я понимаю, столбец 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';
0 голосов
/ 27 февраля 2010

Некоторые советы по оптимизации генератора

Переписать

SELECT @hold = 
'if '''+@temp+'''= ''money'' 
begin
...
end 

как

if @temp = 'money'
begin
...
end

Во-вторых, я не могу вспомнить случай, когда

[rebate2] IS NOT NULL

не подразумевает

len(CONVERT(VARCHAR(8000), [rebate2])) > 0

другими словами, как только rebate2 не станет NULL, длина его строки будет больше 0

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...