2010-05-06 97 views
1

我一直在玩一個非常複雜的SQL語句幾天,並且已經獲得了大部分正常工作。TSQL幫助(SQL Server 2005)

我有最後一個部分的麻煩,並且,想知道如果任何人都可以對這個問題提供一些線索,因爲我不知道爲什麼它不是工作:

INSERT INTO ExistingClientsAccounts_IMPORT 
SELECT DISTINCT 
cca.AccountID, cca.SKBranch, cca.SKAccount, cca.SKName, cca.SKBase, 
cca.SyncStatus, cca.SKCCY, cca.ClientType, cca.GFCID, cca.GFPID, cca.SyncInput, 
cca.SyncUpdate, cca.LastUpdatedBy, cca.Deleted, cca.Branch_Account, cca.AccountTypeID 
FROM   ClientsAccounts AS cca 
INNER JOIN 
(SELECT DISTINCT ClientAccount, SKAccount, SKDesc, 
    SKBase, SKBranch, ClientType, SKStatus, GFCID, 
    GFPID, Account_Open_Date, Account_Update 
FROM   ClientsAccounts_IMPORT) AS ccai 
ON cca.Branch_Account = ccai.ClientAccount 

表定義如下:

CREATE TABLE [dbo].[ExistingClientsAccounts_IMPORT](
    [AccountID] [int] NOT NULL, 
    [SKBranch] [varchar](2) NOT NULL, 
    [SKAccount] [varchar](12) NOT NULL, 
    [SKName] [varchar](255) NULL, 
    [SKBase] [varchar](16) NULL, 
    [SyncStatus] [varchar](50) NULL, 
    [SKCCY] [varchar](5) NULL, 
    [ClientType] [varchar](50) NULL, 
    [GFCID] [varchar](10) NULL, 
    [GFPID] [varchar](10) NULL, 
    [SyncInput] [smalldatetime] NULL, 
    [SyncUpdate] [smalldatetime] NULL, 
    [LastUpdatedBy] [varchar](50) NOT NULL, 
    [Deleted] [tinyint] NOT NULL, 
    [Branch_Account] [varchar](16) NOT NULL, 
    [AccountTypeID] [int] NOT NULL 
) ON [PRIMARY] 


CREATE TABLE [dbo].[ClientsAccounts_IMPORT](
    [NEWClientIndex] [bigint] NOT NULL, 
    [ClientGroup] [varchar](255) NOT NULL, 
    [ClientAccount] [varchar](255) NOT NULL, 
    [SKAccount] [varchar](255) NOT NULL, 
    [SKDesc] [varchar](255) NOT NULL, 
    [SKBase] [varchar](10) NULL, 
    [SKBranch] [varchar](2) NOT NULL, 
    [ClientType] [varchar](255) NOT NULL, 
    [SKStatus] [varchar](255) NOT NULL, 
    [GFCID] [varchar](255) NULL, 
    [GFPID] [varchar](255) NULL, 
    [Account_Open_Date] [smalldatetime] NULL, 
    [Account_Update] [smalldatetime] NULL, 
    [SKType] [varchar](255) NOT NULL 
) ON [PRIMARY] 

我得到的錯誤消息是: Msg 8152,級別16,狀態14,行1 字符串或二進制數據將被截斷。 該聲明已被終止。

+0

我確實知道錯誤信息告訴我什麼,但我不明白的是可能被截斷的部分 – 2010-05-06 09:38:44

+0

hm - 複雜的定義是另一個定義的瑣碎。不復雜。 – TomTom 2010-05-06 09:41:02

+0

這是一個大得多的查詢的一個孤立的部分,但爲了簡單起見,我現在只是簡單地發佈引起我一個問題的部分。 – 2010-05-06 09:43:15

回答

3

錯誤是因爲您正嘗試將數據插入ExistingClientsAccounts_IMPORT中列的大小小於試圖插入其中的數據的長度的列中。

例如 SKAccount列在ExistingClientsAccounts_IMPORT表中是VARCHAR(12),但在ClientsAccounts_IMPORT中是VARCHAR(255)。

因此,如果ClientsAccounts_IMPORT包含該字段長度超過12個字符的行,則會將該錯誤顯示爲obv。例如100個字符不適合12個字符的字段。

您需要確保您要插入的表中的所有列都足夠大 - 確保每個列定義與源表匹配。

0

檢查字段定義。你可以看到一些比原來的小。現在對舊數據運行查詢 - 您會發現使用了一些較大的字段,因此在不丟失數據的情況下插入是不可能的。

實施例:SKAccount - 從255長度爲12

0

SELECT列列表的第三列表示ExistingClientsAccounts_IMPORT.SKAccountClientsAccounts.SKAccount填充 - 然而,所述源是最多255個字符,而目的地的容量12.如果有任何數據不合適,您會收到此消息。

我還沒有經歷過所有其他列。

0

您正在嘗試插入大於爲列指定的最大長度的值。使用分析器檢查傳遞給此查詢的數據,並根據所有列的允許長度驗證數據的長度。

這兩個表的公共列的列長度存在明顯的不匹配。 ClientsAccounts_IMPORT.SKBase是10,而在另一個表中是16。