2017-03-01 544 views
0

我正在使用SQL Server 2012.我正在運行將數據插入表的查詢。我能夠成功運行查詢時我註釋掉的INSERT INTO線,但是當我與INSERT INTO代碼運行它,我得到這個錯誤:SQL Server 2012:將數據類型nvarchar轉換爲float時出錯

Msg 8114, Level 16, State 5, Line 27
Error converting data type nvarchar to float.

代碼:

DECLARE 
@CurrentYear smallint, 
@PriorMonth date, 
@CurrentMonth date, 
@NextMonth date, 
@CompanyCode nvarchar(255), 
@Delegate varchar(25), 
@NAM varchar(2), 
@Division varchar(2), 
@ReportingPeriod varchar(3) 

SELECT 
@CurrentYear = DATEPART(YY, GETDATE()), 
@PriorMonth = EOMONTH(GETDATE(), -2), 
@CurrentMonth = EOMONTH(GETDATE(), -1), 
@NextMonth = GETDATE(), 
@CompanyCode = 'JDE', 
@Delegate = 'Tony Scott', 
@NAM = 'US', 
@Division = 'MO' 

SELECT @ReportingPeriod = dd.FiscalPeriod 
FROM dbo.DateDimension dd (NOLOCK) 
WHERE dd.LastDayOfMonth = @CurrentMonth 

INSERT INTO dbo.GRIR_Main 

SELECT 
    a.CompanyCode, 
    PriceBlk = '', 
    QtyBlk = '', 
    DateBlk = '', 
    TrPrt = NULL, 
    POrg = '', 
    PGr = '', 
    [Description] = '', 
    Plant = '', 
    PlantDescription = '', 
    PurchReq = '', 
    RequistionerName = '', 
    a.GLAcct, 
    WBSElement = '', 
    SalesOrder = '', 
    Network = '', 
    CostCenter = '', 
    Reference = '', 
    a.DocumentNo, 
    a.ProfitCenter, 
    a.[Concatenate], 
    a.Assignment, 
    a.PurchDoc, 
    a.VendorType, 
    Vendor = '', 
    a.Name1, 
    Material = '', 
    ShortText = '', 
    a.ABSVALAmtinLC, 
    GRIRUpdated = NULL, 
    a.AmountinLC, 
    [Type] = '', 
    PostingDate = NULL, 
    a.DaysAged, 
    a.EYAging, 
    a.DaysAgedatMonthEnd, 
    a.EYAgingatMonthEnd, 
    a.RestatedPriorMonth, 
    a.EYAgingPriorMonth, 
    Slippage = 
     CASE 
      WHEN a.EYAging = a.EYAgingPriorMonth THEN '0' 
      ELSE a.EYAging 
     END, 
    a.Category1, 
    a.Analyst, 
    a.ReportingPeriod, 
    a.FY, 
    a.Delegate, 
    a.NAM, 
    a.Supplier, 
    a.Division, 
    a.Company, 
    a.CompanyFilter, 
    a.BU, 
    a.BusinessUnitDescription, 
    a.Buyer, 
    a.OrderNumber, 
    a.OrderType, 
    a.Line, 
    a.ReceiptDate, 
    a.ReceiptDoc, 
    a.QuantityReceived, 
    a.AmountReceived, 
    a.QuantityVouchered, 
    a.AmountVouchered, 
    a.QuantityOpen, 
    a.AmountOpen, 
    a.CurCod, 
    a.BUName, 
    a.Item, 
    a.GRIRPeriod, 
    a.Div 
FROM 
(SELECT 
    Delegate = @Delegate, 
    NAM = @NAM, 
    Assignment = CAST(j.[Order #] AS VARCHAR) + ' - ' + j.[Order Type] + ' - ' + CAST(j.[Line] AS VARCHAR), 
    DocumentNo = CAST(j.[Order #] AS VARCHAR), 
    AmountinLC = j.[Amount Open], 
    PurchDoc = j.[Order #], 
    ReportingPeriod = @ReportingPeriod, 
    FY = @CurrentYear, 
    Analyst = 
     CASE 
      WHEN @CompanyCode IN ('4433', 'PC1') THEN 'Karen Bastek' 
      WHEN @CompanyCode = '5620' THEN 'Alla O''Hara' 
      WHEN @CompanyCode = 'JDE' THEN 'Sharon Dooley' 
      WHEN @CompanyCode IN ('9461', '9462', '9463', '435E', '439Z') THEN 'Irina Shapshevich' 
     END, 
    CompanyCode = @CompanyCode, 
    j.Supplier, 
    Name1 = j.Name, 
    VendorType = 
     CASE 
      WHEN LEFT(j.Name, 7) = 'Siemens' THEN 'ICC' 
      ELSE '3rd Party' 
     END, 
    Div = j.[DIV #], 
    j.Company, 
    CompanyFilter = 
     CASE 
      WHEN j.Company IN ('31100','40021') THEN j.Company 
      ELSE 'All Others' 
     END, 
    BU = j.[BU #], 
    BusinessUnitDescription = j.[Business Unit Description], 
    j.Buyer, 
    OrderNumber = j.[Order #], 
    OrderType = j.[Order Type], 
    j.Line, 
    ReceiptDate = CONVERT(varchar(10), j.[Receipt Date], 101), 
    ReceiptDoc = j.[Receipt Doc], 
    QuantityReceived = j.[Qty Recvd], 
    AmountReceived = j.[Amount Rcvd], 
    QuantityVouchered = j.[Qty Vouchered], 
    AmountVouchered = j.[Amount Vouchered], 
    QuantityOpen = j.[Qty Open], 
    AmountOpen = j.[Amount Open], 
    CurCod = j.[Curr Code], 
    ABSVALAmtinLC = ABS(j.[Amount Open]), 
    Concatenate = CAST(j.Supplier AS VARCHAR) + CAST(j.[Order #] AS VARCHAR) + j.[Order Type] + CAST(CONVERT(varchar(10), j.[Receipt Date], 101) AS VARCHAR) + CAST(j.[Receipt Doc] AS VARCHAR), 
    DaysAged = DATEDIFF(DAY, j.[Receipt Date], @CurrentMonth), 
    EYAging = 
     CASE 
      WHEN DATEDIFF(DAY, j.[Receipt Date], @CurrentMonth) > 365 THEN 'h 365 + Days' 
      WHEN DATEDIFF(DAY, j.[Receipt Date], @CurrentMonth) > 180 THEN 'g 180 - 365 Days' 
      WHEN DATEDIFF(DAY, j.[Receipt Date], @CurrentMonth) > 150 THEN 'f 150 - 180 Days' 
      WHEN DATEDIFF(DAY, j.[Receipt Date], @CurrentMonth) > 120 THEN 'e 120 - 150 Days' 
      WHEN DATEDIFF(DAY, j.[Receipt Date], @CurrentMonth) > 90 THEN 'd 90 - 120 Days' 
      WHEN DATEDIFF(DAY, j.[Receipt Date], @CurrentMonth) > 60 THEN 'c 60 - 90 Days' 
      WHEN DATEDIFF(DAY, j.[Receipt Date], @CurrentMonth) > 30 THEN 'b 30 - 60 Days' 
      ELSE 'a Current' 
     END, 
    DaysAgedatMonthEnd = DATEDIFF(DAY, j.[Receipt Date], @NextMonth), 
    EYAgingatMonthEnd = 
     CASE 
      WHEN DATEDIFF(DAY, j.[Receipt Date], @NextMonth) > 365 THEN 'h 365 + Days' 
      WHEN DATEDIFF(DAY, j.[Receipt Date], @NextMonth) > 180 THEN 'g 180 - 365 Days' 
      WHEN DATEDIFF(DAY, j.[Receipt Date], @NextMonth) > 150 THEN 'f 150 - 180 Days' 
      WHEN DATEDIFF(DAY, j.[Receipt Date], @NextMonth) > 120 THEN 'e 120 - 150 Days' 
      WHEN DATEDIFF(DAY, j.[Receipt Date], @NextMonth) > 90 THEN 'd 90 - 120 Days' 
      WHEN DATEDIFF(DAY, j.[Receipt Date], @NextMonth) > 60 THEN 'c 60 - 90 Days' 
      WHEN DATEDIFF(DAY, j.[Receipt Date], @NextMonth) > 30 THEN 'b 30 - 60 Days' 
      ELSE 'a Current' 
     END, 
    RestatedPriorMonth = DATEDIFF(DAY, j.[Receipt Date], @PriorMonth), 
    EYAgingPriorMonth = 
     CASE 
      WHEN DATEDIFF(DAY, j.[Receipt Date], @PriorMonth) < 0 THEN 'False' 
      WHEN DATEDIFF(DAY, j.[Receipt Date], @PriorMonth) > 365 THEN 'h 365 + Days' 
      WHEN DATEDIFF(DAY, j.[Receipt Date], @PriorMonth) > 180 THEN 'g 180 - 365 Days' 
      WHEN DATEDIFF(DAY, j.[Receipt Date], @PriorMonth) > 150 THEN 'f 150 - 180 Days' 
      WHEN DATEDIFF(DAY, j.[Receipt Date], @PriorMonth) > 120 THEN 'e 120 - 150 Days' 
      WHEN DATEDIFF(DAY, j.[Receipt Date], @PriorMonth) > 90 THEN 'd 90 - 120 Days' 
      WHEN DATEDIFF(DAY, j.[Receipt Date], @PriorMonth) > 60 THEN 'c 60 - 90 Days' 
      WHEN DATEDIFF(DAY, j.[Receipt Date], @PriorMonth) > 30 THEN 'b 30 - 60 Days' 
      ELSE 'a Current' 
     END, 
    Category1 = j.[Category 1], 
    GLAcct = CAST(j.[GL Account] AS float), 
    ProfitCenter = j.[GL Account], 
    Division = @Division, 
    BUName = m.[BU Name], 
    j.Item, 
    GRIRPeriod = @ReportingPeriod 

FROM 
    dbo.GRIR_JDE j (NOLOCK) 
    INNER JOIN dbo.MOBusinessSegment m (NOLOCK) ON j.[BU #] = m.PRCTR 
) AS a 

這裏表格定義,我試圖插入數據:

CREATE TABLE [dbo].[GRIR_Main](
    [CompanyCode] [varchar](25) NULL, 
    [PriceBlk] [nvarchar](255) NULL, 
    [QtyBlk] [nvarchar](255) NULL, 
    [DateBlk] [nvarchar](255) NULL, 
    [TrPrt] [float] NULL, 
    [POrg] [nvarchar](255) NULL, 
    [PGr] [nvarchar](255) NULL, 
    [Description] [nvarchar](255) NULL, 
    [Plant] [nvarchar](255) NULL, 
    [PlantDescription] [nvarchar](255) NULL, 
    [PurchReq] [varchar](255) NULL, 
    [RequistionerName] [nvarchar](255) NULL, 
    [GLAcct] [float] NULL, 
    [WBSElement] [nvarchar](255) NULL, 
    [SalesOrder] [nvarchar](255) NULL, 
    [Network] [nvarchar](255) NULL, 
    [CostCenter] [nvarchar](255) NULL, 
    [Reference] [nvarchar](255) NULL, 
    [DocumentNo] [nvarchar](255) NULL, 
    [ProfitCenter] [nvarchar](255) NULL, 
    [Concatenate] [nvarchar](255) NULL, 
    [Assignment] [nvarchar](255) NULL, 
    [PurchDoc] [float] NULL, 
    [VendorType] [nvarchar](255) NULL, 
    [Vendor] [nvarchar](255) NULL, 
    [Name1] [nvarchar](255) NULL, 
    [Material] [nvarchar](255) NULL, 
    [ShortText] [nvarchar](255) NULL, 
    [ABSVALAmtinLC] [float] NULL, 
    [GRIRUpdated] [float] NULL, 
    [AmountinLC] [float] NULL, 
    [Type] [nvarchar](255) NULL, 
    [PostingDate] [datetime] NULL, 
    [DaysAged] [float] NULL, 
    [EYAging] [nvarchar](255) NULL, 
    [DaysAgedatMonthEnd] [float] NULL, 
    [EYAgingatMonthEnd] [nvarchar](255) NULL, 
    [RestatedPriorMonth] [float] NULL, 
    [EYAgingPriorMonth] [nvarchar](255) NULL, 
    [Slippage] [nvarchar](255) NULL, 
    [Category1] [nvarchar](255) NULL, 
    [Analyst] [nvarchar](255) NULL, 
    [ReportingPeriod] [nvarchar](255) NULL, 
    [FY] [float] NULL, 
    [Delegate] [nvarchar](255) NULL, 
    [NAM] [nchar](2) NULL, 
    [Supplier] [nvarchar](255) NULL, 
    [Division] [nvarchar](255) NULL, 
    [Company] [nvarchar](255) NULL, 
    [CompanyFilter] [nvarchar](255) NULL, 
    [BU] [nvarchar](255) NULL, 
    [BusinessUnitDescription] [nvarchar](255) NULL, 
    [Buyer] [nvarchar](255) NULL, 
    [OrderNumber] [float] NULL, 
    [OrderType] [nvarchar](255) NULL, 
    [Line] [float] NULL, 
    [ReceiptDate] [datetime] NULL, 
    [ReceiptDoc] [float] NULL, 
    [QuantityReceived] [float] NULL, 
    [AmountReceived] [float] NULL, 
    [QuantityVouchered] [float] NULL, 
    [AmountVouchered] [float] NULL, 
    [QuantityOpen] [float] NULL, 
    [AmountOpen] [float] NULL, 
    [CurCod] [nvarchar](255) NULL, 
    [BUName] [nvarchar](255) NULL, 
    [Item] [nvarchar](255) NULL, 
    [GRIRPeriod] [nvarchar](255) NULL, 
    [Div] [nvarchar](255) NULL 
) ON [PRIMARY] 

我知道我有一個類型不匹配的地方,但我似乎無法找到它。以下是源數據的表格定義。

CREATE TABLE [dbo].[GRIR_JDE](
    [Supplier] [float] NULL, 
    [Name] [nvarchar](255) NULL, 
    [Order #] [float] NULL, 
    [Order Type] [nvarchar](255) NULL, 
    [Category 1] [nvarchar](255) NULL, 
    [Supplier Type] [nvarchar](255) NULL, 
    [DIV #] [nvarchar](255) NULL, 
    [Company] [nvarchar](255) NULL, 
    [BU #] [nvarchar](255) NULL, 
    [Business Unit Description] [nvarchar](255) NULL, 
    [Buyer] [nvarchar](255) NULL, 
    [Item Branch Buyer] [nvarchar](255) NULL, 
    [Line] [float] NULL, 
    [ESN] [nvarchar](255) NULL, 
    [Item] [nvarchar](255) NULL, 
    [Receipt Date] [datetime] NULL, 
    [Qty Recvd] [float] NULL, 
    [Amount Rcvd] [float] NULL, 
    [Qty Vouchered] [float] NULL, 
    [Amount Vouchered] [float] NULL, 
    [Qty Open] [float] NULL, 
    [Amount Open] [float] NULL, 
    [Curr Code] [nvarchar](255) NULL, 
    [Receipt Doc] [float] NULL, 
    [GL Account] [nvarchar](255) NULL, 
    [Time Stamp] [datetime] NULL 
) ON [PRIMARY] 
+1

你爲什麼到處都用'float'和'nvarchar(255)'?這只是馬虎... [踢壞的習慣:選擇錯誤的數據類型 - Aaron Bertrand - 2009-10-12](http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/12/bad -habits-to-kick-using-the-wrong-data-type.aspx) – SqlZim

+0

我還沒有根據需要清理所有東西。現在我只是想開始工作,然後我會回去清理它,這是一個骯髒的過程。 – tsqln00b

回答

0

如果你想運行它,後來它清理乾淨,使用的try_功能之一:

在SQL Server 2012及以上:每個將返回null當轉換失敗,而不是一個錯誤。


檢查的j.[Order #]

類型,你正在使用它同時作爲floatnvarchar(255)在:

... 
[DocumentNo] [nvarchar](255) NULL, 
[PurchDoc] [float] NULL,   
... 
DocumentNo = j.[Order #], 
PurchDoc = j.[Order #], 

同樣的問題在這裏:

GLAcct = j.[GL Account], 
ProfitCenter = j.[GL Account], 
+0

我認爲這是問題,我試圖將其解決,它仍然給我錯誤。 GLAcct = CAST(j。[GL帳戶] AS浮動) – tsqln00b

0

看來,GL科目字段的內容投射到浮球失敗。我將主表上的字段更改爲varchar,現在它可以工作。

相關問題