2013-03-08 3 views
0

Это мои 2 таблицне может конвертировать VARCHAR плавать в SQL

CREATE TABLE [dbo].[dailyRate](
[SYMBOL] [varchar](50) NULL, 
[SERIES] [varchar](50) NULL, 
[OPENPRICE] [varchar](50) NULL, 
[HIGHPRICE] [varchar](50) NULL, 
[LOWPRICE] [varchar](50) NULL, 
[CLOSEPRICE] [varchar](50) NULL, 
[LASTPRICE] [varchar](50) NULL, 
[PREVCLOSE] [varchar](50) NULL, 
[TOTTRDQTY] [varchar](50) NULL, 
[TOTTRDVAL] [varchar](50) NULL, 
[TIMESTAMPDAY] [varchar](50) NULL, 
[TOTALTRADES] [varchar](50) NULL, 
[ISIN] [varchar](50) NULL 
) 


CREATE TABLE [dbo].[cmpDailyRate](
[ID] [bigint] IDENTITY(1,1) NOT NULL, 
[SYMBOL] [varchar](50) NULL, 
[SERIES] [varchar](50) NULL, 
[OPENPRICE] [decimal](18, 4) NULL, 
[HIGHPRICE] [decimal](18, 4) NULL, 
[LOWPRICE] [decimal](18, 4) NULL, 
[CLOSEPRICE] [decimal](18, 4) NULL, 
[LASTPRICE] [decimal](18, 4) NULL, 
[PREVCLOSE] [decimal](18, 4) NULL, 
[TOTTRDQTY] [bigint] NULL, 
[TOTTRDVAL] [decimal](18, 4) NULL, 
[TIMESTAMPDAY] [smalldatetime] NULL, 
[TOTALTRADES] [bigint] NULL, 
[ISIN] [varchar](50) NULL, 
[M_Avg] [decimal](18, 4) NULL 
) 

это моя вставка запрос для выборки данных из таблицы в другую с литьем

Collapse | Скопировать код

INSERT into [Stock].[dbo].[cmpDailyRate] 
SELECT [SYMBOL],[SERIES],Str([OPENPRICE], 18,4),Str([HIGHPRICE],18,4), 
Str([LOWPRICE],18,4),Str([CLOSEPRICE],18,4),Str([LASTPRICE],18,4),Str([PREVCLOSE],18,4),convert(bigint,[TOTTRDQTY]),Str([TOTTRDVAL],18,4), 
convert(date, [TIMESTAMPDAY], 105),convert(bigint,[TOTALTRADES]),[ISIN],null 
FROM [Stock].[dbo].[DailyRate] 

Этот запрос отлично работает в SQL Server 2005, но это приводит к возникновению ошибок в SQL Server 2008 (выше запуска запроса и в SQL Server 2008 при установке; ошибки возникают в последние несколько дней)

Ошибка :

Ошибка не может преобразовать VARCHAR плавать

Что делать?

+2

Проверьте свои данные для недопустимых значений –

+0

Вы не имеете WHERE фильтра в вашем примере, но мне интересно, если вы в своем коде. Если вы это сделаете, или если DailyRate будет усечен и пополнен, вы можете получить ошибку, казалось бы, случайным образом, если вы получите недопустимые значения в своих данных. Нижеприведенный пример, вероятно, является более безопасным подходом. –

ответ

1

Одна из ваших строк содержит недопустимые данные в столбцах, в которые вы выполняете преобразование с плавающей точкой (Str). Используйте следующую стратегию для разработки которых:

SELECT * 
FROM [dailyRate] 
WHERE IsNumeric([OPENPRICE]) = 0 
OR IsNumeric([HIGHPRICE]) = 0 

и т.д. и т.п.

+0

Я предлагал И вместо OR –

+0

@Praveen: И помог бы только в том случае, если несколько значений были неверны в одной строке. Исходный запрос не будет выполнен, если в ЛЮБОЙ колонке содержится неправильное значение. –

+0

где и isnumeric (...) не хватает - sql может (и часто делает) конвертировать значения перед применением условия. case isnumeric (...) then ... else ... end сделает трюк. – Arvo

0

Если вы не хотите, чтобы отфильтровать данные, случай оператор может работать лучше для вас.

SELECT CASE 
     WHEN IsNumeric([OPENPRICE]) = 1 THEN [OPENPRICE] 
     ELSE NULL -- or 0 or whatever 
     END AS OPENPRICE, 
     CASE 
     WHEN IsNumeric([HIGHPRICE]) = 1 THEN [HIGHPRICE] 
     ELSE NULL -- or 0 or whatever 
     END AS [HIGHPRICE] 
FROM [dailyRate] 
Смежные вопросы