插入temptable时出错

时间:2014-07-02 15:12:32

标签: sql tsql

我有一个#temptable,我试图填充它但不起作用。

DECLARE
         @nBranchId int 
        ,@tmStartDate datetime
        ,@tmEndDate datetime 


SELECT   @nBranchId = 3483
        ,@tmStartDate = DATEADD(DAY, -10, GETDATE())
        ,@tmEndDate = GETDATE()


CREATE table #temptable (
     nResultsId int
    ,nInstrId int
    ,nBranchId int
    ,nFoldersId int
    ,strPaperId varchar(50)
    ,strPosName varchar(50)
    ,fQuantity float
    ,fRevaluationPrice float
    ,fHistRevaluationPrice float
    ,tmDate datetime
    ,nPrevResultsId int
) 

INSERT INTO #temptable
SELECT  
         xpr.nResultsId
        ,xpr.nInstrId
        ,xpr.nBranchId
        ,xpr.nFoldersId
        ,xpr.strPaperId
        ,xpr.strPosName
        ,xpr.fQuantity
        ,xpr.fRevaluationPrice
        ,xpr.fHistRevaluationPrice
        ,xpr.tmDate
        ,nPrevResultsId = dbo.fnGetPrevTradeResultId(xpr.nBranchId, xpr.nInstrId, xpr.strPaperId, xpr.strPosName,xpr.tmDate, xpr.nFoldersId) 
FROM    dbo.XP_Results AS xpr WITH(READUNCOMMITTED)
WHERE 1 = 1
        AND xpr.nBranchId = ISNULL(@nBranchId, xpr.nBranchId)
        AND xpr.tmDate BETWEEN @tmStartDate AND @tmEndDate
        AND xpr.nInstrId <> 18


DROP table #temptable

出现此错误:

Msg 8152,Level 16,State 14,Line 28 字符串或二进制数据将被截断。 声明已经终止。

我错过了哪里?看了又看了但不能解决它

3 个答案:

答案 0 :(得分:2)

您有不同长度的数据类型

要避免此问题,请使用SELECT INTO声明

#Temptable将使用正确的数据类型自动创建(您不必使用脚本CREATE声明的额外好处)

DECLARE
         @nBranchId int 
        ,@tmStartDate datetime
        ,@tmEndDate datetime 


SELECT   @nBranchId = 3483
        ,@tmStartDate = DATEADD(DAY, -10, GETDATE())
        ,@tmEndDate = GETDATE()

SELECT   xpr.nResultsId
        ,xpr.nInstrId
        ,xpr.nBranchId
        ,xpr.nFoldersId
        ,xpr.strPaperId
        ,xpr.strPosName
        ,xpr.fQuantity
        ,xpr.fRevaluationPrice
        ,xpr.fHistRevaluationPrice
        ,xpr.tmDate
        ,nPrevResultsId = dbo.fnGetPrevTradeResultId(xpr.nBranchId, xpr.nInstrId, xpr.strPaperId, xpr.strPosName,xpr.tmDate, xpr.nFoldersId) 
INTO #temptable
FROM    dbo.XP_Results AS xpr WITH(READUNCOMMITTED)
WHERE 1 = 1
        AND xpr.nBranchId = ISNULL(@nBranchId, xpr.nBranchId)
        AND xpr.tmDate BETWEEN @tmStartDate AND @tmEndDate
        AND xpr.nInstrId <> 18


DROP table #temptable

答案 1 :(得分:1)

应该通过将这两列更改为这样来修复。可能发生的事情是,您正在尝试将大于50个字符的varchars插入varchar(50)列。

strPaperId varchar(max),
strPosName varchar(max)

答案 2 :(得分:1)

这意味着您的一个列的数据大于您为临时表列声明的数据类型大小。

例如,如果您有一个varchar(2)的临时表列,然后尝试插入值&#39; 123&#39;,您将收到该错误消息,因为我们插入的值比您要插入的列的大小。请注意,此消息可以表示任何类型。

找出带有问题的临时表列,并将大小增加到实际表中的大小。