Вставка работает по разным запросам, но не по 3 столбцам - PullRequest
0 голосов
/ 06 августа 2020

Ваша помощь очень ценится! Я получаю эту ошибку:

Имя столбца или количество предоставленных значений не соответствует определению таблицы.

Заранее спасибо

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)

1 Ответ

2 голосов
/ 06 августа 2020

Это ошибка синтаксического анализа. Вы создаете таблицу #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)

Msg 213, Level 16, State 1, Line 30 Имя столбца или количество предоставленных значений не соответствует определению таблицы.

Не запускайте ваши операторы в одном и том же наборе пакетов (то есть в разных соединениях), и ошибка не возникнет. Создание одной и той же таблицы в одном наборе пакетов с разными определениями в любом случае кажется ошибкой при выборе дизайна, поэтому простое исправление дает двум объектам разные имена:

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;

Если по какой-то странной причине , объекты « должны » иметь одинаковое имя, тогда вам нужно будет отложить синтаксический анализ последнего оператора, используя оператор «Dynami c», чтобы отложить проверку:

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;
...