SQL insert使用select from .. where not exists和select子句中的局部变量失败

时间:2014-02-04 16:00:50

标签: sql sql-server

我正在尝试从表A中将记录插入到表B中,其中记录在表B中不存在。只有我需要的一些字段在表A中,所以我设置了一些局部变量来插入这些数据。在运行下面的查询时,我收到错误消息

“消息8114,级别16,状态5,行17错误将数据类型varchar转换为数字。”

是否有人能够告诉我我做错了什么,并且可能提供一种可行的替代方法。非常感谢(并对查询格式化道歉)

DECLARE @SupplierID as integer
DECLARE @UnitOfMeasurementID as integer
DECLARE @MinOrderQuantity as integer
DECLARE @SupplierProductGroupID as integer
DECLARE @ProductCondition as varchar (3)

SET @SupplierID = 1007
SET @UnitOfMeasurementID = 1
SET @MinOrderQuantity = 1
SET @SupplierProductGroupID = 41
SET @ProductCondition = 'N'


-- Insert

insert into tblProduct (SupplierID,
            UnitOfMeasurementID,
            MinOrderQuantity,
            SupplierProductGroupID,
            ProductCondition,
            PartNumber,
            ProductName,
            CostPrice)  
select 
    PartNumber,
    ProductName,
    CostPrice,
    @SupplierID, 
    @UnitOfMeasurementID,
    @MinOrderQuantity,
    @SupplierProductGroupID,
    @ProductCondition
from BearmachTemp source
where not exists
    (
        select * from tblProduct 
        where tblProduct.PartNumber = source.PartNumber
        and tblProduct.ProductName = source.ProductName
    )

3 个答案:

答案 0 :(得分:2)

SELECT的列顺序错误

select 
    @SupplierID, 
    @UnitOfMeasurementID,
    @MinOrderQuantity,
    @SupplierProductGroupID,
    @ProductCondition,
    PartNumber,
    ProductName,
    CostPrice
from BearmachTemp source
where not exists
(
    select * from tblProduct 
    where tblProduct.PartNumber = source.PartNumber
    and tblProduct.ProductName = source.ProductName
)

答案 1 :(得分:0)

在插入语句中插入列和值应具有相同的顺序,因此:

insert into tblProduct (SupplierID,
            UnitOfMeasurementID,
            MinOrderQuantity,
            SupplierProductGroupID,
            ProductCondition,
            PartNumber,
            ProductName,
            CostPrice)  
select 
    @SupplierID, 
    @UnitOfMeasurementID,
    @MinOrderQuantity,
    @SupplierProductGroupID,
    @ProductCondition,
    PartNumber,
    ProductName,
    CostPrice



from BearmachTemp source
where not exists
    (
        select * from tblProduct 
        where tblProduct.PartNumber = source.PartNumber
        and tblProduct.ProductName = source.ProductName
    )

答案 2 :(得分:0)

查看您的查询听起来好像您希望SQL按名称匹配字段,但它没有。 INSERT INTO子句中字段的名称是无关紧要的 - 匹配将根据顺序进行,因此在您的情况下,PartNumber的值将进入SupplierID,ProductName的值将进入UnitOfMeasurementID等。只需更改顺序插入到tblProduct(...)部分或select ...部分中的字段使它们匹配,你就可以了。