从联合语句插入新表时发生数据转换错误

时间:2019-05-12 14:27:48

标签: sql sql-server

我正在从4个表的联接中进行简单插入。 当我从联接中选择列时,它们将无缝工作。 但是,当我尝试将其插入到新创建的表中时,会收到以下消息

“将varchar值“ White”转换为数据类型int时转换失败。”

这很可能来自Dim_Borrower表中的“种族”列。

在Dim_Borrower中,race列是varchar(50) 我在新表中将Race列创建为varchar(50)。

试图了解我为什么会收到此错误以及如何解决该问题。

下面是我的查询

Create Table Param_Data(



 LoanAmount int,
   [Purpose of Loan] varchar (50),
   PropertyUsage varchar (50),
   MonthlyIncome int,
   MaritalStatus varchar (50),
   Race varchar (50),
   Ethnicity varchar (50),
   Sex varchar (50),
   LoanDate datetime,
   DOB datetime,
   )
   Insert into Param_Data
   select a.LoanAmount,a.MonthlyIncome,c.[Property Usage], d.Race, d.Ethnicity,d.Sex, d.MaritalStatus, d.DOB, b.LoanDate, b.[Purpose of Loan]
            FROM        dbo.Fact_Financials a
            LEFT JOIN   dbo.Dim_Loan b
            ON          a.Loan_ID = b.Loan_ID
            LEFT JOIN   Dim_Property c
            ON          a.Property_ID = c.Property_ID
            LEFT JOIN   dbo.Dim_Borrower d
            ON          a.Borrower_ID = d.Borrower_ID

我在尝试拖放和重新创建时遇到了麻烦,请检查以确保目标表和原始表中的race列都是varchar。

2 个答案:

答案 0 :(得分:2)

当然,您应该按INSERT列列表的顺序列出SELECT语句中的列。但是没有列列表可供您插入。 另外,您可以使用SELECT INTO语句,这样将自动创建表,并且不会出现这些问题

select a.LoanAmount
,a.MonthlyIncome
,c.[Property Usage]
, d.Race
, d.Ethnicity
,d.Sex
, d.MaritalStatus
, d.DOB
, b.LoanDate
, b.[Purpose of Loan]
INTO Param_data          
FROM        dbo.Fact_Financials a
            LEFT JOIN   dbo.Dim_Loan b
            ON          a.Loan_ID = b.Loan_ID
            LEFT JOIN   Dim_Property c
            ON          a.Property_ID = c.Property_ID
            LEFT JOIN   dbo.Dim_Borrower d
            ON          a.Borrower_ID = d.Borrower_ID

答案 1 :(得分:0)

在进行INSERT时显式列出该列。然后确保列对齐! SQL使用INSERT中列的位置,而不使用它们的名称。 (这可能是违反直觉的,因为SQL通常依赖名称而不是标识列的位置。)

您不排队:

INSERT into Param_Data (LoanAmount, [Purpose of Loan], PropertyUsage, MonthlyIncome,
                        MaritalStatus, Race, Ethnicity, Sex,
                        LoanDate, DOB
                       )
    SELECT ff.LoanAmount, ff.MonthlyIncome,
           p.[Property Usage], d.Race, d.Ethnicity, d.Sex, d.MaritalStatus, d.DOB,
           l.LoanDate, l.[Purpose of Loan]
    FROM dbo.Fact_Financials ff LEFT JOIN
         dbo.Dim_Loan l
         ON ff.Loan_ID = l.Loan_ID LEFT JOIN
         Dim_Property p
         ON ff.Property_ID = p.Property_ID LEFT JOIN
         dbo.Dim_Borrower b
         ON ff.Borrower_ID = b.Borrower_ID;

您需要重新排列列-我更愿意在SELECT中而不是在INSERT中重新排列它们:

INSERT into Param_Data (LoanAmount, [Purpose of Loan], PropertyUsage, MonthlyIncome,
                        MaritalStatus, Race, Ethnicity, Sex,
                        LoanDate, DOB
                       )
    SELECT ff.LoanAmount, l.[Purpose of Loan], p.[Property Usage], ff.MonthlyIncome,
           d.MaritalStatus, d.Race, d.Ethnicity, d.Sex,
           l.LoanDate, d.DOB
    FROM dbo.Fact_Financials ff LEFT JOIN
         dbo.Dim_Loan l
         ON ff.Loan_ID = l.Loan_ID LEFT JOIN
         Dim_Property p
         ON ff.Property_ID = p.Property_ID LEFT JOIN
         dbo.Dim_Borrower b
         ON ff.Borrower_ID = b.Borrower_ID;

请注意,我还将表别名更改为有意义的-表名的缩写。这使查询更易于理解。