2013-03-08 52 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 
) 

這是我的插入查詢,從表鑄造

收起獲取數據到另一個|複製代碼

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

檢查您的數據爲 – 2013-03-08 11:22:53

+0

您沒有一個WHERE過濾器在你的榜樣無效值,但我,如果你在你的代碼做好奇。如果您這樣做,或者如果DailyRate被截斷並重新填充,如果您的數據中出現無效值,您可能會看似隨機出現此錯誤。下面的情況說明可能是更安全的方法。 – 2013-03-08 15:07:15

回答

1

您的某行在您正在執行浮點轉換(Str)的列中包含無效數據。使用下面的策略制定,其中:

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

等等等等

+0

我確實建議使用AND而不是OR – 2013-03-08 11:36:15

+0

@Praveen:只有在同一行上有多個值不正確時纔會有所幫助。如果ANY列包含不正確的值,原始查詢將失敗。 – 2013-03-08 11:40:18

+0

where和isnumeric(...)是不夠的 - sql可能(並經常)在應用條件之前轉換值。 case isnumeric(...)then ... else ... end會執行該操作。 – Arvo 2013-03-08 11:51:41

0

如果你不想篩選出的數據,一個CASE語句可能更好地爲你。

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]