Carla Romere
asked on
T-SQL Query Explanation
I am writing a query to archive some data in a few of our huge tables in our ERP system.
I made a mistake in my delete statement and would like for someone to explain to me exactly how the delete query ran at all. Here is the full query:
In the delete statement's subquery, I had the wrong field selected and the field I put in there doesn't exist. In (SELECT GEM_DBKEY FROM #BINMOVEMENTS) the field GEM_DBKEY should have been OLD_GEM_DBKEY. When I run that subquery select statement, I get the following error.
/*------------------------
SELECT GEM_DBKEY FROM #BINMOVEMENTS
------------------------*/
Msg 207, Level 16, State 1, Line 1
Invalid column name 'GEM_DBKEY'.
I would expect to get this error if the field isn't found. However, when I ran the delete statement above, it deleted EVERY RECORD in the IC_BIN_MOVEMENTS table. I am hoping someone could explain that to me because it is escaping me now. We are using APEX SQL to try to get the data restored. But it will take a while to restore 22m rows instead of the 5.5m that *should* have been deleted. I'm just trying to understand WHY it deleted anything.
I made a mistake in my delete statement and would like for someone to explain to me exactly how the delete query ran at all. Here is the full query:
/* IC BIN MOVEMENTS */
CREATE TABLE #BINMOVEMENTS(
[OLD_GEM_DBKEY] [int] NOT NULL, --WILL BE ORIGINAL GEM_DBKEY FROM IC_BIN_MOVEMENTS
[COMPANY_CODE] [varchar](10) NOT NULL,
[WAREHOUSE] [varchar](2) NOT NULL,
[PART_CODE] [varchar](15) NULL,
[BIN_LOCATION] [varchar](15) NOT NULL,
[MH_NUMBER] [int] NOT NULL,
[DOCUMENT_NUMBER] [varchar](13) NOT NULL,
[DOCUMENT_LINE] [varchar](9) NULL,
[DOCUMENT_SEQUENCE] [smallint] NOT NULL,
[UNIT_OF_MEASURE] [varchar](4) NULL,
[SOURCE_MODULE] [varchar](2) NULL,
[TRANSACTION_TYPE] [varchar](2) NULL,
[FACTORY] [varchar](2) NOT NULL,
[WAREHOUSE_ZONE] [varchar](6) NOT NULL,
[MOVEMENT_DATE] [datetime] NULL,
[SYSTEM_DATE] [datetime] NOT NULL,
[USERNAME] [varchar](12) NOT NULL,
[SYS_CALLING_FUNCTION] [varchar](15) NOT NULL,
[IC_STATUS_CODE] [varchar](8) NOT NULL,
[IC_LOT_NUMBER] [varchar](15) NOT NULL,
[IC_LOT_SEQUENCE] [int] NOT NULL,
[IC_QUANTITY_FIELD] [varchar](30) NOT NULL,
[IC_MOVE_QUANTITY] [numeric](20, 6) NOT NULL,
[IC_PRODUCT_UOM_TYPE] [varchar](1) NOT NULL,
[MOVEMENT_CODE] [varchar](6) NULL,
[TRANSACTION_DESCRIPTION] [varchar](30) NULL,
[PERIOD] [smallint] NOT NULL,
[YEAR] [smallint] NOT NULL,
[GEM_TRANSACTION_ID] [varchar](64) NULL
)
INSERT INTO #BINMOVEMENTS (
OLD_GEM_DBKEY,
COMPANY_CODE,
WAREHOUSE,
PART_CODE,
BIN_LOCATION,
MH_NUMBER,
DOCUMENT_NUMBER,
DOCUMENT_LINE,
DOCUMENT_SEQUENCE,
UNIT_OF_MEASURE,
SOURCE_MODULE,
TRANSACTION_TYPE,
FACTORY,
WAREHOUSE_ZONE,
MOVEMENT_DATE,
SYSTEM_DATE,
USERNAME,
SYS_CALLING_FUNCTION,
IC_STATUS_CODE,
IC_LOT_NUMBER,
IC_LOT_SEQUENCE,
IC_QUANTITY_FIELD,
IC_MOVE_QUANTITY,
IC_PRODUCT_UOM_TYPE,
MOVEMENT_CODE,
TRANSACTION_DESCRIPTION,
PERIOD,
[YEAR],
GEM_TRANSACTION_ID
)
(
SELECT C.[GEM_DBKEY]
,C.[COMPANY_CODE]
,C.[WAREHOUSE]
,C.[PART_CODE]
,C.[BIN_LOCATION]
,C.[MH_NUMBER]
,C.[DOCUMENT_NUMBER]
,C.[DOCUMENT_LINE]
,C.[DOCUMENT_SEQUENCE]
,C.[UNIT_OF_MEASURE]
,C.[SOURCE_MODULE]
,C.[TRANSACTION_TYPE]
,C.[FACTORY]
,C.[WAREHOUSE_ZONE]
,C.[MOVEMENT_DATE]
,C.[SYSTEM_DATE]
,C.[USERNAME]
,C.[SYS_CALLING_FUNCTION]
,C.[IC_STATUS_CODE]
,C.[IC_LOT_NUMBER]
,C.[IC_LOT_SEQUENCE]
,C.[IC_QUANTITY_FIELD]
,C.[IC_MOVE_QUANTITY]
,C.[IC_PRODUCT_UOM_TYPE]
,C.[MOVEMENT_CODE]
,C.[TRANSACTION_DESCRIPTION]
,C.[PERIOD]
,C.[YEAR]
,C.[GEM_TRANSACTION_ID]
FROM [fin_prod].[dbo].[IC_BIN_MOVEMENTS] C
INNER JOIN DC_LICENSE_PLATE_LINES L
ON C.COMPANY_CODE = L.COMPANY_CODE
AND C.PART_CODE=L.PART_CODE
AND C.IC_LOT_NUMBER = L.IC_LOT_NUMBER
RIGHT OUTER JOIN DC_LICENSE_PLATES P
ON P.COMPANY_CODE = L.COMPANY_CODE
AND P.DC_LICENSE_PLATE_ID = L.DC_LICENSE_PLATE_ID
WHERE MOVEMENT_DATE < GETDATE()-365
AND P.DC_LICENSE_PLATE_STATUS IN('INACTIVE','SHIPPED')
AND C.GEM_DBKEY IS NOT NULL
)
INSERT INTO [fin_prod].[dbo].[AER_IC_BIN_MOVEMENTS_ARC]
([COMPANY_CODE]
,[WAREHOUSE]
,[PART_CODE]
,[BIN_LOCATION]
,[MH_NUMBER]
,[DOCUMENT_NUMBER]
,[DOCUMENT_LINE]
,[DOCUMENT_SEQUENCE]
,[UNIT_OF_MEASURE]
,[SOURCE_MODULE]
,[TRANSACTION_TYPE]
,[FACTORY]
,[WAREHOUSE_ZONE]
,[MOVEMENT_DATE]
,[SYSTEM_DATE]
,[USERNAME]
,[SYS_CALLING_FUNCTION]
,[IC_STATUS_CODE]
,[IC_LOT_NUMBER]
,[IC_LOT_SEQUENCE]
,[IC_QUANTITY_FIELD]
,[IC_MOVE_QUANTITY]
,[IC_PRODUCT_UOM_TYPE]
,[MOVEMENT_CODE]
,[TRANSACTION_DESCRIPTION]
,[PERIOD]
,[YEAR]
,[GEM_TRANSACTION_ID]
,[OLD_GEM_DBKEY])
(SELECT [COMPANY_CODE]
,[WAREHOUSE]
,[PART_CODE]
,[BIN_LOCATION]
,[MH_NUMBER]
,[DOCUMENT_NUMBER]
,[DOCUMENT_LINE]
,[DOCUMENT_SEQUENCE]
,[UNIT_OF_MEASURE]
,[SOURCE_MODULE]
,[TRANSACTION_TYPE]
,[FACTORY]
,[WAREHOUSE_ZONE]
,[MOVEMENT_DATE]
,[SYSTEM_DATE]
,[USERNAME]
,[SYS_CALLING_FUNCTION]
,[IC_STATUS_CODE]
,[IC_LOT_NUMBER]
,[IC_LOT_SEQUENCE]
,[IC_QUANTITY_FIELD]
,[IC_MOVE_QUANTITY]
,[IC_PRODUCT_UOM_TYPE]
,[MOVEMENT_CODE]
,[TRANSACTION_DESCRIPTION]
,[PERIOD]
,[YEAR]
,[GEM_TRANSACTION_ID]
,[OLD_GEM_DBKEY]
FROM #BINMOVEMENTS)
DELETE FROM dbo.IC_BIN_MOVEMENTS
WHERE GEM_DBKEY IN(SELECT GEM_DBKEY FROM #BINMOVEMENTS)
DROP TABLE #BINMOVEMENTS
In the delete statement's subquery, I had the wrong field selected and the field I put in there doesn't exist. In (SELECT GEM_DBKEY FROM #BINMOVEMENTS) the field GEM_DBKEY should have been OLD_GEM_DBKEY. When I run that subquery select statement, I get the following error.
/*------------------------
SELECT GEM_DBKEY FROM #BINMOVEMENTS
------------------------*/
Msg 207, Level 16, State 1, Line 1
Invalid column name 'GEM_DBKEY'.
I would expect to get this error if the field isn't found. However, when I ran the delete statement above, it deleted EVERY RECORD in the IC_BIN_MOVEMENTS table. I am hoping someone could explain that to me because it is escaping me now. We are using APEX SQL to try to get the data restored. But it will take a while to restore 22m rows instead of the 5.5m that *should* have been deleted. I'm just trying to understand WHY it deleted anything.
ASKER
No, I made absolutely sure that both rows were highlighted. I just did not catch that I hadn't updated the field name in the subquery.
Try that on a new query window, sql server wont drop the actual table definition even if you delete them manually.
check my blog here
http://sequelserver.blogspot.ca/2013/04/did-drop-table-temp-actually-deletes.html
check my blog here
http://sequelserver.blogspot.ca/2013/04/did-drop-table-temp-actually-deletes.html
ASKER
I haven't run the drop (temp) table statement. I ONLY ran the delete statement by itself (after running everything above the delete statement - one statement at a time). The temp table is still there because I haven't closed that session yet. I'm just curious why EVERY row was deleted in the IC_BIN_MOVEMENTS table when the select query for the delete referenced a field that didn't exist.
if you are using APEX , then why don't you find the statement that ran the delete
ASKER
We are still pulling the logs. I just thought there might be an error in my syntax or something and wondered if anyone could tell me.
I cannot think of any cases how your query can run ?
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
Okay that makes perfect sense and was exactly what I wanted to find out. Thank you so much for explaining that to me!
Nice catch Scott. Missed that one.
Any change that only the DELETE FROM dbo.IC_BIN_MOVEMENTS line was highlighted when it was executed?
If a selection is made and the Execute button is hit, it executes only the selection.