首页 > 解决方案 > 插入适用于不同的查询,但不适用于 3 列

问题描述

非常感谢您的帮助!我收到此错误:

列名或提供的值的数量与表定义不匹配。

先感谢您

IF OBJECT_ID('tempdb..#VAR_TABLE5') IS NOT NULL
DROP TABLE #VAR_TABLE5

CREATE TABLE #VAR_TABLE5
(
     K_NAME   varchar (30),
     V_NAME   INT,
     V_NAME2  INT
)

INSERT INTO #VAR_TABLE5
    SELECT 
        'Average Plan Cost PMPM', 
        (SELECT Sum (CLNT_NET_DUE_AMT + NBNR_CLNT_NET_DUE_AMT ) / SUM(EOM_MBR_CNT) / DATEDIFF(M, MIN(ELGBLTY_CLNDR_MNTH_END_DT),  MAX(ELGBLTY_CLNDR_MNTH_END_DT))       
         FROM #Elig_Smry_M),
        (SELECT SUM(CLNT_NET_DUE_AMT + NBNR_CLNT_NET_DUE_AMT ) / SUM(EOM_MBR_CNT) / DATEDIFF(M, MIN(ELGBLTY_CLNDR_MNTH_END_DT), MIN(ELGBLTY_CLNDR_MNTH_END_DT)) 
         FROM #Elig_Smry_M)

但是下面这个有效,我只需要第二次添加它,(VAR2 的列)

IF OBJECT_ID('tempdb..#VAR_TABLE5') IS NOT NULL
    DROP TABLE #VAR_TABLE5

CREATE TABLE #VAR_TABLE5
(
    K_NAME VARCHAR(30),
    V_NAME INT
)

INSERT INTO #VAR_TABLE5
    SELECT  
        'Average Plan Cost PMPM',  
        (SELECT SUM(CLNT_NET_DUE_AMT + NBNR_CLNT_NET_DUE_AMT ) / SUM(EOM_MBR_CNT) / DATEDIFF(M, MIN(ELGBLTY_CLNDR_MNTH_END_DT), MAX(ELGBLTY_CLNDR_MNTH_END_DT)) 
         FROM #Elig_Smry_M)

标签: sql-serverinsert

解决方案


这是一个解析错误。您#VAR_TABLE5在前一批中创建表,然后在后一批中创建表,DROP然后CREATE再次创建。解析第二INSERT条语句时,它使用表的第一个定义(有 3 列),因此出现错误。如果您使用以下内容,则会重现该问题:

CREATE TABLE #Elig_Smry_M (CLNT_NET_DUE_AMT DECIMAL(8,2), NBNR_CLNT_NET_DUE_AMT DECIMAL(8, 2), EOM_MBR_CNT DECIMAL(8,2), ELGBLTY_CLNDR_MNTH_END_DT DATE)

IF OBJECT_ID('tempdb..#VAR_TABLE5') IS NOT NULL
DROP TABLE #VAR_TABLE5

CREATE TABLE #VAR_TABLE5
(
     K_NAME   varchar (30),
     V_NAME   INT,
     V_NAME2  INT
)

INSERT INTO #VAR_TABLE5
    SELECT 
        'Average Plan Cost PMPM', 
        (SELECT Sum (CLNT_NET_DUE_AMT + NBNR_CLNT_NET_DUE_AMT ) / SUM(EOM_MBR_CNT) / DATEDIFF(M, MIN(ELGBLTY_CLNDR_MNTH_END_DT),  MAX(ELGBLTY_CLNDR_MNTH_END_DT))       
         FROM #Elig_Smry_M),
        (SELECT SUM(CLNT_NET_DUE_AMT + NBNR_CLNT_NET_DUE_AMT ) / SUM(EOM_MBR_CNT) / DATEDIFF(M, MIN(ELGBLTY_CLNDR_MNTH_END_DT), MIN(ELGBLTY_CLNDR_MNTH_END_DT)) 
         FROM #Elig_Smry_M)
GO
IF OBJECT_ID('tempdb..#VAR_TABLE5') IS NOT NULL
    DROP TABLE #VAR_TABLE5

CREATE TABLE #VAR_TABLE5
(
    K_NAME VARCHAR(30),
    V_NAME INT
)

INSERT INTO #VAR_TABLE5
    SELECT  
        'Average Plan Cost PMPM',  
        (SELECT SUM(CLNT_NET_DUE_AMT + NBNR_CLNT_NET_DUE_AMT ) / SUM(EOM_MBR_CNT) / DATEDIFF(M, MIN(ELGBLTY_CLNDR_MNTH_END_DT), MAX(ELGBLTY_CLNDR_MNTH_END_DT)) 
         FROM #Elig_Smry_M)

消息 213,级别 16,状态 1,第 30 行
列名或提供的值的数量与表定义不匹配。

不要在同一组批次(即不同的连接)中运行您的语句,并且不会发生错误。无论如何,在同一组批次中创建同一个表,但定义不同似乎是一个设计选择错误,所以简单的修复它为 2 个对象提供不同的名称:

CREATE TABLE #Elig_Smry_M (CLNT_NET_DUE_AMT DECIMAL(8,2), NBNR_CLNT_NET_DUE_AMT DECIMAL(8, 2), EOM_MBR_CNT DECIMAL(8,2), ELGBLTY_CLNDR_MNTH_END_DT DATE)

IF OBJECT_ID('tempdb..#VAR_TABLE5') IS NOT NULL
DROP TABLE #VAR_TABLE5

CREATE TABLE #VAR_TABLE5
(
     K_NAME   varchar (30),
     V_NAME   INT,
     V_NAME2  INT
)

INSERT INTO #VAR_TABLE5
    SELECT 
        'Average Plan Cost PMPM', 
        (SELECT Sum (CLNT_NET_DUE_AMT + NBNR_CLNT_NET_DUE_AMT ) / SUM(EOM_MBR_CNT) / DATEDIFF(M, MIN(ELGBLTY_CLNDR_MNTH_END_DT),  MAX(ELGBLTY_CLNDR_MNTH_END_DT))       
         FROM #Elig_Smry_M),
        (SELECT SUM(CLNT_NET_DUE_AMT + NBNR_CLNT_NET_DUE_AMT ) / SUM(EOM_MBR_CNT) / DATEDIFF(M, MIN(ELGBLTY_CLNDR_MNTH_END_DT), MIN(ELGBLTY_CLNDR_MNTH_END_DT)) 
         FROM #Elig_Smry_M)

GO
IF OBJECT_ID('tempdb..#VAR_TABLE5') IS NOT NULL
    DROP TABLE #VAR_TABLE6

CREATE TABLE #VAR_TABLE6
(
    K_NAME VARCHAR(30),
    V_NAME INT
)

INSERT INTO #VAR_TABLE6
    SELECT  
        'Average Plan Cost PMPM',  
        (SELECT SUM(CLNT_NET_DUE_AMT + NBNR_CLNT_NET_DUE_AMT ) / SUM(EOM_MBR_CNT) / DATEDIFF(M, MIN(ELGBLTY_CLNDR_MNTH_END_DT), MAX(ELGBLTY_CLNDR_MNTH_END_DT)) 
         FROM #Elig_Smry_M)
GO
DROP TABLE #Elig_Smry_M;

如果出于某种奇怪的原因,对象“必须”具有相同的名称,那么您将需要通过使用“动态”语句来延迟后一个语句的解析以延迟验证:

CREATE TABLE #Elig_Smry_M (CLNT_NET_DUE_AMT DECIMAL(8,2), NBNR_CLNT_NET_DUE_AMT DECIMAL(8, 2), EOM_MBR_CNT DECIMAL(8,2), ELGBLTY_CLNDR_MNTH_END_DT DATE)

IF OBJECT_ID('tempdb..#VAR_TABLE5') IS NOT NULL
DROP TABLE #VAR_TABLE5

CREATE TABLE #VAR_TABLE5
(
     K_NAME   varchar (30),
     V_NAME   INT,
     V_NAME2  INT
)

INSERT INTO #VAR_TABLE5
    SELECT 
        'Average Plan Cost PMPM', 
        (SELECT Sum (CLNT_NET_DUE_AMT + NBNR_CLNT_NET_DUE_AMT ) / SUM(EOM_MBR_CNT) / DATEDIFF(M, MIN(ELGBLTY_CLNDR_MNTH_END_DT),  MAX(ELGBLTY_CLNDR_MNTH_END_DT))       
         FROM #Elig_Smry_M),
        (SELECT SUM(CLNT_NET_DUE_AMT + NBNR_CLNT_NET_DUE_AMT ) / SUM(EOM_MBR_CNT) / DATEDIFF(M, MIN(ELGBLTY_CLNDR_MNTH_END_DT), MIN(ELGBLTY_CLNDR_MNTH_END_DT)) 
         FROM #Elig_Smry_M)

GO
IF OBJECT_ID('tempdb..#VAR_TABLE5') IS NOT NULL
    DROP TABLE #VAR_TABLE5

CREATE TABLE #VAR_TABLE5
(
    K_NAME VARCHAR(30),
    V_NAME INT
)
DECLARE @SQL nvarchar(MAX);
SET @SQL = N'INSERT INTO #VAR_TABLE5
    SELECT  
        ''Average Plan Cost PMPM'',  
        (SELECT SUM(CLNT_NET_DUE_AMT + NBNR_CLNT_NET_DUE_AMT ) / SUM(EOM_MBR_CNT) / DATEDIFF(M, MIN(ELGBLTY_CLNDR_MNTH_END_DT), MAX(ELGBLTY_CLNDR_MNTH_END_DT)) 
         FROM #Elig_Smry_M)';

EXEC sys.sp_executesql @SQL;

GO
DROP TABLE #Elig_Smry_M;

推荐阅读