2010-05-06 98 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。