Sql 合并导致强制转换错误日期时间-->;国际的

Sql 合并导致强制转换错误日期时间-->;国际的,sql,tsql,datetime,sql-merge,Sql,Tsql,Datetime,Sql Merge,我不明白为什么会发生这个错误。其他人能帮我找出错误吗?我试图合并到一个临时表中,并得到错误 不允许从数据类型datetime隐式转换为int。使用 转换函数以运行此查询。错误被标识为发生在合并开始的行上 查询: SELECT BookID AS KTSID, ResourceID AS FLRID, ls.ID AS SiteShelfID, ls.CustomerNumber AS SiteCustNum, ls.DivisionID AS SiteD

我不明白为什么会发生这个错误。其他人能帮我找出错误吗?我试图合并到一个临时表中,并得到错误

不允许从数据类型datetime隐式转换为int。使用 转换函数以运行此查询。错误被标识为发生在合并开始的行上

查询:

SELECT 
    BookID AS KTSID,
    ResourceID AS FLRID,
    ls.ID AS SiteShelfID,
    ls.CustomerNumber AS SiteCustNum,
    ls.DivisionID AS SiteDivID,
    st.DateCreated AS SiteBibDateAdded,
    st.TotalCopies AS SiteQtyOwned,
    ls.ParentLibraryShelfID AS ProviderShelfID,
    NULL AS ProviderCustNum,
    NULL AS ProviderDivID,
    NULL AS ProviderBibDateAdded,
    NULL AS ProviderQtyOwned
INTO #TitleData
FROM dapadmin.ShelfTitle st
    JOIN dapadmin.LibraryShelf ls ON st.LibraryShelfID = ls.ID
    JOIN #TitlesToInclude tti     ON st.ID = tti.ShelfTitleId


MERGE #TitleData WITH(HOLDLOCK) AS td
    USING (SELECT 
            st.BookID AS KTSID,
            st.ResourceID AS FLRID,         
            st.LibraryShelfID AS SiteShelfID,   
            ls2.CustomerNumber AS SiteCustNum,
            ls2.DivisionID AS SiteDivID,
            s.ProviderShelfID,
            ls.CustomerNumber AS ProviderCustNum,
            ls.DivisionID AS ProviderDivID,
            st.DateCreated AS ProviderBibDateAdded,
            st.TotalCopies AS ProviderQtyOwned
        FROM @ShelfIdsToSearch s
        JOIN dapadmin.ShelfTitle st 
            ON s.ProviderShelfId = st.LibraryShelfID
        JOIN #TitleData td 
            ON td.KTSID = st.BookID 
            AND td.FLRID = st.ResourceID
            AND td.SiteShelfId = s.LibraryShelfId
            AND td.ProviderShelfID = st.LibraryShelfID      
        JOIN #TitlesToInclude tti 
            ON st.ID = tti.ShelfTitleId
            OR s.ProviderHasChanged = 1
        JOIN dapadmin.LibraryShelf ls
            ON s.ProviderShelfId = ls.ID
        JOIN dapadmin.LibraryShelf ls2
            ON s.LibraryShelfId = ls.ID
        ) AS pt

    ON td.KTSID = pt.KTSID 
        AND td.FLRID = pt.FLRID
        AND pt.SiteShelfID = td.SiteShelfID
WHEN MATCHED THEN
    UPDATE
        SET ProviderCustNum      = pt.ProviderCustNum,
            ProviderDivID        = pt.ProviderDivID,
            ProviderBibDateAdded = pt.ProviderBibDateAdded,
            ProviderQtyOwned     = pt.ProviderQtyOwned
WHEN NOT MATCHED THEN
    INSERT (KTSID, FLRID, SiteShelfID, SiteCustNum, SiteDivID, 
            SiteBibDateAdded, SiteQtyOwned, ProviderShelfID, 
            ProviderCustNum, ProviderDivID, 
            ProviderBibDateAdded, ProviderQtyOwned)
    VALUES (pt.KTSID, pt.FLRID, pt.SiteShelfID, pt.SiteCustNum, pt.SiteDivID, 
            NULL, NULL, pt.ProviderShelfID, 
            pt.ProviderCustNum, pt.ProviderDivID, 
            pt.ProviderBibDateAdded, pt.ProviderQtyOwned)
;

假设
ProviderBibDateAdded
的类型为整数,并且您打算在其中填充日期时间,请尝试将update语句更改为:

UPDATE
    SET ProviderCustNum      = pt.ProviderCustNum,
        ProviderDivID        = pt.ProviderDivID,
        ProviderBibDateAdded = Cast(pt.ProviderBibDateAdded as Integer),
        ProviderQtyOwned     = pt.ProviderQtyOwned
INSERT (KTSID, FLRID, SiteShelfID, SiteCustNum, SiteDivID, 
        SiteBibDateAdded, SiteQtyOwned, ProviderShelfID, 
        ProviderCustNum, ProviderDivID, ProviderBibDateAdded, 
        ProviderQtyOwned)
VALUES (pt.KTSID, pt.FLRID, pt.SiteShelfID, pt.SiteCustNum, 
        pt.SiteDivID, NULL, NULL, pt.ProviderShelfID, 
        pt.ProviderCustNum, pt.ProviderDivID, 
        cast(pt.ProviderBibDateAdded as Integer), 
        pt.ProviderQtyOwned)
以及您对此的插入声明:

UPDATE
    SET ProviderCustNum      = pt.ProviderCustNum,
        ProviderDivID        = pt.ProviderDivID,
        ProviderBibDateAdded = Cast(pt.ProviderBibDateAdded as Integer),
        ProviderQtyOwned     = pt.ProviderQtyOwned
INSERT (KTSID, FLRID, SiteShelfID, SiteCustNum, SiteDivID, 
        SiteBibDateAdded, SiteQtyOwned, ProviderShelfID, 
        ProviderCustNum, ProviderDivID, ProviderBibDateAdded, 
        ProviderQtyOwned)
VALUES (pt.KTSID, pt.FLRID, pt.SiteShelfID, pt.SiteCustNum, 
        pt.SiteDivID, NULL, NULL, pt.ProviderShelfID, 
        pt.ProviderCustNum, pt.ProviderDivID, 
        cast(pt.ProviderBibDateAdded as Integer), 
        pt.ProviderQtyOwned)
如果这确实是一个问题,那么您可以在向临时表中插入任何内容之前,使用显式数据类型创建临时表

Declare @TitleData (
     KTSID integer not null,
     FLRID integer not null,
     SiteShelfID integer not null,
     SiteCustNum varChar(??),
     SiteDivID integer not null,
     SiteBibDateAdded Datetime not null,
     SiteQtyOwned smallInt,
     ProviderShelfID integer not null,
     ProviderCustNum varChar(??) Null,
     ProviderDivID Integer null,
     ProviderBibDateAdded Datetime null,
     ProviderQtyOwned null)

Insert @TitleData (KTSID, FLRID, SiteShelfID, 
    SiteCustNum, SiteDivID, SiteBibDateAdded,
    SiteQtyOwned, ProviderShelfID)
SELECT BookID, ResourceID, ls.ID,
   ls.CustomerNumber, ls.DivisionID,
   st.DateCreated, st.TotalCopies,
   ls.ParentLibraryShelfID
From dapadmin.ShelfTitle st
    JOIN dapadmin.LibraryShelf ls 
       ON st.LibraryShelfID = ls.ID
    JOIN #TitlesToInclude tti     
       ON st.ID = tti.ShelfTitleId

但是ProviderBibDateAdded是日期时间,而不是整数。现在我看到,当我创建第一个表时,我为ProviderBibDateAdded传递了一个NULL,所以我猜默认类型是INT。有没有办法将DATETIME指定为由SELECT…INTO创建的临时表中的列的类型?或者我需要显式地创建表来实现这一点吗?而且,建议的更改不会使错误消失。。。。但是,如果我在UPDATE子句中也应用了强制转换,那么错误就会消失。所以你关于问题根源的指导是正确的。感谢您的快速响应!这只是一个猜测,假设
ProviderBibDateAdded
的类型是整数,您需要在其中填充一个日期时间。如果
ProviderBibDateAdded
是日期时间,那么这就是死胡同,抱歉。另一种方法是尝试将datetime填充到需要整数的字段或内存变量中。但这是我在你的代码中看到的唯一可能是错误的赋值的地方。我想你在看到我对第二条注释的编辑之前一定已经注释过了。您认为问题所在的ProviderBibDate是正确的。现在我的问题是,在创建原始表时,我可以说“NULL AS DATETIME”这样的话吗?这样我以后就可以将DATETIME值粘贴到该列中。是的,这正是要做的。但是为什么不创建临时表(或表变量,以明确的数据类型开始呢?参见我的编辑t参见…o