Share via

column name or number of supplied values does not match table definition

Jinal Contractor 121 Reputation points
2020-11-17T23:24:18.507+00:00

I was trying to add Column name MISC4 from PRD1.JDB.dbo.Customer but it's giving me an error for "column name or number of supplied values does not match table definition".
Posting my script here can someone guide me where I made a mistake?

DECLARE @StartDate DATETIME
DECLARE @EndDate DATETIME

SET @StartDate = DATEADD(day,DATEDIFF(day,0,GETDATE()),-7)
SET @EndDate = DATEADD(day,DATEDIFF(day,0,GETDATE()),0)

CREATE TABLE #TempChanges
(
CUSTNO varchar(50),
ITMCLSS VARCHAR(50),
OLDVALUE varchar(50),
NEWVALUE VARCHAR(50),
CHANGEDATE DATETIME,
CHANGEUSER VARCHAR(50),
MISC4 VARCHAR(50),
ISPROSPECT BIT
)

INSERT INTO #TempChanges
SELECT A.KEYVAL, RIGHT(RTRIM(A.NEWVAL),LEN(RTRIM(A.NEWVAL))-2) AS ITMCLSS, LEFT(A.OLDVAL,1), LEFT(A.NEWVAL,1), A.ADDDATE, A.ADDUSER, 0
FROM tbUDT A
INNER JOIN tbCUST C ON RTRIM(C.CUSTNO) = RTRIM(A.KEYVAL)
WHERE A.TBL = 'ICDISC'
AND A.FLDNAM = 'LEVEL'
AND C.NATION = 1
AND C.MISC4 ='Master Code'
AND A.ADDDATE BETWEEN @StartDate AND @EndDate

CREATE TABLE #TempLynxChanges
(
CustomerPricingLevelID int,
PriceTypeID_Old int,
PriceTypeID_New int,
UpdateDate datetime,
UserName varchar(50)
)

INSERT INTO #TempLynxChanges

SELECT
CAST(REPLACE(REPLACE(PK,'<CustomerPricingLevelID=',''),'>','') AS INT) AS CustomerPricingLevelID,
ISNULL(OldValue,'1'),
NewValue,
UpdateDate,
REPLACE(UserName,'PSP\','')
FROM PRD1.JDB.dbo.Audit
WHERE UpdateDate BETWEEN @StartDate AND @EndDate AND TableName = 'Customer_Pricing_Level' AND FieldName = 'PriceTypeID' AND NewValue IS NOT null
--WHERE UpdateDate BETWEEN @StartDate AND @EndDate AND TableName = 'Customer_Pricing_Level' AND FieldName = 'PriceTypeID' AND NewValue <> null

INSERT INTO #TempChanges
SELECT C.CustomerNumber,
IC.ItemClass,
CASE WHEN O.Name = 'Preferred Price' THEN '1' ELSE RTRIM(REPLACE(O.Name,'Level','')) END,
CASE WHEN N.Name = 'Preferred Price' THEN '1' ELSE RTRIM(REPLACE(N.Name,'Level','')) END,
T.UpdateDate,
T.UserName,
C.MISC4,
C.IsProspect
FROM #TempLynxChanges T
INNER JOIN PRD1.JDB.dbo.Customer_Pricing_Level CPL ON CPL.CustomerPricingLevelID = T.CustomerPricingLevelID
INNER JOIN PRD1.JDB.dbo.Customer C ON C.CustomerID = CPL.CustomerID
INNER JOIN PRD1.JDB.dbo.Product_Item_Class IC ON IC.ItemClassID = CPL.ItemClassID
LEFT OUTER JOIN PRD1.DB.dbo.Product_Price_Type O ON O.PriceTypeID = T.PriceTypeID_Old
LEFT OUTER JOIN PRD1.DB.dbo.Product_Price_Type N ON N.PriceTypeID = T.PriceTypeID_New
AND C.IsNationalAccount = 0

DROP TABLE #TempLynxChanges

CREATE TABLE #CustomerYTDSales
(
CUSTNO varchar(50),
YTDSALES decimal(19,6)
)

CREATE TABLE #CustomerYTDItemClassSales
(
CUSTNO varchar(50),
ITMCLSS varchar(50),
YTDSALES decimal(19,6)
)

INSERT INTO #CustomerYTDSales
SELECT DISTINCT A.CUSTNO, SUM(ISNULL(A.EXTPRICE,0))
FROM vwARDSLS A
INNER JOIN #TempChanges T ON T.CUSTNO = A.CUSTNO
WHERE A.INVDTE BETWEEN DATEADD(YY, DATEDIFF(YY, 0, GETDATE()), 0) AND GETDATE()
GROUP BY A.CUSTNO

INSERT INTO #CustomerYTDItemClassSales
SELECT DISTINCT A.CUSTNO, A.ITMCLSS, SUM(ISNULL(A.EXTPRICE,0))
FROM vwASLS A
INNER JOIN #TempChanges T ON T.CUSTNO = A.CUSTNO AND T.ITMCLSS = A.ITMCLSS
WHERE A.INVDTE BETWEEN DATEADD(YY, DATEDIFF(YY, 0, GETDATE()), 0) AND GETDATE()
GROUP BY A.CUSTNO, A.ITMCLSS

CREATE TABLE ##TempLevels
(
CustomerNumber VARCHAR(50),
ItemClass varchar(50),
OldLevel varchar(50),
NewLevel varchar(50),
DateChanged datetime,
TotalYTDSales decimal(19,2),
YTDSalesForThisItemClass decimal(19,2),
SalesRepForCustomer varchar(50),
ChangedBy varchar(50),
SalesManager varchar(50),
MISC4 VARCHAR(50),
IsProspect bit
)

INSERT INTO ##TempLevels
SELECT DISTINCT
X.CUSTNO as 'Customer Number',
X.ITMCLSS as 'Item Class',
LTRIM(ISNULL(X.OLDVALUE,'1')) AS 'Old Level',
LTRIM(X.NEWVALUE) AS 'New Level',
X.CHANGEDATE AS 'Date Changed',
ISNULL(Y.YTDSALES,0) AS 'Total YTD Sales',
ISNULL(I.YTDSALES,0) AS 'YTD Sales for This Item Class',
CASE WHEN X.ISPROSPECT = 0 THEN C.SALESMN ELSE dbo.f_GetSalesrep(X.CUSTNO, X.CHANGEDATE) END AS 'Sales Rep for Customer',
CASE WHEN X.MISC4 = 0 THEN C.SALESMN ELSE dbo.f_GetSalesrep(X.CUSTNO, X.CHANGEDATE) END AS 'Member Code',
CASE WHEN X.CHANGEUSER = 'WebService' THEN dbo.f_GetSalesrep(X.CUSTNO, X.CHANGEDATE) ELSE X.CHANGEUSER END AS 'Changed By',
dbo.f_GetSalesrepManager(CASE WHEN X.ISPROSPECT = 0 THEN C.SALESMN ELSE dbo.f_GetSalesrep(X.CUSTNO, X.CHANGEDATE) END) AS 'Sales Manager',
X.ISPROSPECT
FROM #TempChanges X
LEFT OUTER JOIN #CustomerYTDSales Y ON Y.CUSTNO = X.CUSTNO
LEFT OUTER JOIN #CustomerYTDItemClassSales I ON I.CUSTNO = X.CUSTNO AND I.ITMCLSS = X.ITMCLSS
LEFT OUTER JOIN tbCUST C ON C.CUSTNO = X.CUSTNO
WHERE LTRIM(ISNULL(X.OLDVALUE,'1')) <> LTRIM(X.NEWVALUE)

Developer technologies | Transact-SQL
Developer technologies | Transact-SQL

A Microsoft extension to the ANSI SQL language that includes procedural programming, local variables, and various support functions.

{count} votes

2 answers

Sort by: Most helpful
  1. MelissaMa-msft 24,246 Reputation points Moderator
    2020-11-18T01:30:37.057+00:00

    Hi @Jinal Contractor ,

    Thank you so much for posting here.

    Your temp table #TempChanges was defined as 8 columns but in your next insert into #TempChanges statement there were only 7 value.

    Please refer below and update your statement accordingly.

    INSERT INTO #TempChanges  
    SELECT A.KEYVAL, RIGHT(RTRIM(A.NEWVAL),LEN(RTRIM(A.NEWVAL))-2) AS ITMCLSS,   
    LEFT(A.OLDVAL,1), LEFT(A.NEWVAL,1), A.ADDDATE, A.ADDUSER,   
    '' MISC4  ---add one value for MISC4 column  
    ,0  
    FROM tbUDT A  
    INNER JOIN tbCUST C ON RTRIM(C.CUSTNO) = RTRIM(A.KEYVAL)  
    WHERE A.TBL = 'ICDISC'  
    AND A.FLDNAM = 'LEVEL'  
    AND C.NATION = 1  
    AND C.MISC4 ='Master Code'  
    AND A.ADDDATE BETWEEN @StartDate AND @EndDate  
    

    Best regards
    Melissa


    If the answer is helpful, please click "Accept Answer" and upvote it.
    Note: Please follow the steps in our documentation to enable e-mail notifications if you want to receive the related email notification for this thread.
    Hot issues November--What can I do if my transaction log is full?
    Hot issues November--How to convert Profiler trace into a SQL Server table

    0 comments No comments

  2. Tom Cooper 8,496 Reputation points
    2020-11-18T00:38:06.107+00:00

    You declare #TempChanges with 8 columns. But in the first insert (the one immediately after the Create Table for #TempChanges) you don't specify the columns you are inserting into which means you must supply a value for every column in the table. But your select statement only has 7 columns, not 8. So either supply a value for all 8 columns in your Select or if you only want to have 7 columns in the Select statement, you must supply the 7 columns you want in the Insert clause, for example
    Insert #TempChanges(CUSTNO, ITMCLSS, OLDVALUE, NEWVALUE, CHANGEDATE, CHANGEUSER, ISPROSPECT)

    And even if you are supplying data for every column, it is considered best practice to always specify the columns you are inserting into in your Insert clause.

    Tom

    0 comments No comments

Your answer

Answers can be marked as 'Accepted' by the question author and 'Recommended' by moderators, which helps users know the answer solved the author's problem.