Error converting data type varchar to numeric in SQL - sql

I have spent the last 3 hours trying to figure this out but I have had not luck. When executing this SP I get the below error:
Msg 8114, Level 16, State 5, Procedure sp_SPLIT_CARTON, Line 28
Error converting data type varchar to numeric.
Here is the SP and help is really appreciated
USE [1_WMS]
GO
ALTER PROCEDURE [dbo].sp_SPLIT_CARTON
#FROM_CARTON VARCHAR(20)
, #TO_CARTON VARCHAR(20)
, #SKU VARCHAR(20)
, #QTY DECIMAL
, #USER VARCHAR(20)
AS
DECLARE
#DATE VARCHAR(10)
, #TIME VARCHAR(8)
, #SYS_CONFIG_CODE VARCHAR(5)
, #SYS_CONFIG_VALUE INT
, #CN_STATUS INT
, #CN_STATUS_1 INT --USE FOR BETWEEN STATEMENT
, #CN_STATUS_2 INT --USE FOR BETWEEN STATEMENT
, #CN_STORE VARCHAR(10)
SET #DATE = CONVERT(VARCHAR(10), GETDATE(),101);
SET #TIME = CONVERT(VARCHAR(8), GETDATE(),114);
SET #SYS_CONFIG_CODE = 'SPLCN';
SET #CN_STATUS_1 = '10';
--SET #CN_STATUS_2 = 20;
--THIS IS LINE 28
/*CHECK FOR VALID CARTON STATUS BEFORE SPLITTING*/
SELECT #CN_STATUS = cn_status
, #CN_STORE = cn_store
FROM CARTON
WHERE cn_number = #FROM_CARTON --I BELIEVE THIS IS THE PIECE OF CODE CAUSING THE ISSUE
IF #CN_STATUS = #CN_STATUS_1
BEGIN
/*CHECK FOR SYSTEM CONFIGURATION*/
SELECT #SYS_CONFIG_VALUE = sys_value FROM SYS_CONFIG
WHERE sys_code = #SYS_CONFIG_CODE
IF #SYS_CONFIG_VALUE = 1
BEGIN
/*REMOVE SKU FROM CURRENT CARTON*/
DELETE FROM CARTON_DETAIL
WHERE cd_carton_number = #FROM_CARTON
AND cd_barcode = #SKU
/*UPDATE THE CARTON HEADER*/
UPDATE CARTON
SET cn_packed_qty = cn_packed_qty - #QTY
, cn_modify_date = #DATE
, cn_modify_time = #TIME
, cn_modify_by = #USER
WHERE cn_number = #FROM_CARTON
AND cn_status BETWEEN #CN_STATUS_1 AND #CN_STATUS_2
/*CREATE NEW CARTON HEADER*/
INSERT INTO CARTON
(
cn_number
)
VALUES
(
#FROM_CARTON
)
/*CREATE CARTON DETAIL*/
INSERT INTO CARTON_DETAIL
(
cd_carton_number
)
VALUES
(
#TO_CARTON
)
END
ELSE IF #SYS_CONFIG_VALUE = 0
BEGIN
/*REMOVE SKU FROM CURRENT CARTON*/
DELETE FROM CARTON_DETAIL
WHERE cd_carton_number = #FROM_CARTON
AND cd_barcode = #SKU
/*UPDATE THE CARTON HEADER*/
UPDATE CARTON
SET cn_packed_qty = cn_packed_qty - #QTY
, cn_modify_date = #DATE
, cn_modify_time = #TIME
, cn_modify_by = #USER
WHERE cn_number = #FROM_CARTON
AND cn_status BETWEEN #CN_STATUS_1 AND #CN_STATUS_2
/*GET THE NEXT CARTON FROM COUNTERS*/
SELECT #TO_CARTON = counter_current FROM COUNTERS WHERE counter_name = (
SELECT DISTINCT so_counter_name FROM STORES WHERE SO_NUMBER = (
SELECT DISTINCT cn_store FROM CARTON WHERE cn_number = #FROM_CARTON))
/*UPDATE THE COUNTER AFTER GETTING THE NEXT CARTON NUMBER*/
UPDATE COUNTERS SET counter_current = counter_current + 1
, counter_next = counter_next + 1
WHERE counter_name = (SELECT DISTINCT so_counter_name FROM STORES WHERE SO_NUMBER = (
SELECT DISTINCT cn_store FROM CARTON WHERE cn_number = #FROM_CARTON))
/*CREATE NEW CARTON HEADER*/
DECLARE
#CN_NUMBER VARCHAR(20) , #CN_PICKTICKET VARCHAR(20) , #2ndCN_STORE VARCHAR(10) , #CN_LOAD_NUMBER VARCHAR(20)
, #CN_SHIPMENT_NUMBER VARCHAR(20) , #CN_MANIFEST_NUMBER VARCHAR(20) , #CN_PACKED_QTY DECIMAL , #CN_TRACKING_NUMBER VARCHAR(20)
, #CN_TYPE VARCHAR(5) , #CN_PACK_TYPE VARCHAR(5) , #CN_ROUTE VARCHAR(5) , #CN_SHIP_VIA VARCHAR(5)
, #CN_BOL VARCHAR(20) , #CN_MBOL VARCHAR(20) , #CN_PARCEL_NUMBER VARCHAR(10) , #CN_TRAILER_NUMBER VARCHAR(10)
, #CN_AREA VARCHAR(10) , #CN_ZONE VARCHAR(10) , #CN_AISLE VARCHAR(10) , #CN_LEVEL VARCHAR(10)
, #CN_POSITION VARCHAR(10) , #CN_HEIGHT DECIMAL , #CN_WIDTH DECIMAL , #CN_DIMENSION DECIMAL
, #CN_WEIGHT DECIMAL , #CN_VOLUME DECIMAL , #2ndCN_STATUS INT , #CN_ADDRESS VARCHAR(150)
, #CN_ADDRESS_1 VARCHAR(150) , #CN_CITY VARCHAR(50) , #CN_STATE VARCHAR(50) , #CN_ZIP_CODE VARCHAR(20)
, #CN_COUNTRY VARCHAR(50) , #CN_MISC7 VARCHAR(50) , #CN_MISC8 VARCHAR(50) , #CN_MISC9 VARCHAR(50)
, #CN_MISC10 VARCHAR(50)
SET #CN_NUMBER = #TO_CARTON SET #2ndCN_STORE = #CN_STORE SET #CN_LOAD_NUMBER = ''
SET #CN_SHIPMENT_NUMBER = '' SET #CN_MANIFEST_NUMBER = '' SET #CN_PACKED_QTY = ''
SET #CN_TRACKING_NUMBER = '' SET #CN_TYPE = 'SPLIT' SET #CN_PACK_TYPE = 'SPLITTED'
SET #CN_ROUTE = '' SET #CN_SHIP_VIA = '' SET #CN_BOL = ''
SET #CN_MBOL = '' SET #CN_PARCEL_NUMBER = '' SET #CN_TRAILER_NUMBER = ''
SET #CN_AREA = '' SET #CN_ZONE = '' SET #CN_AISLE = ''
SET #CN_LEVEL = '' SET #CN_POSITION = '' SET #CN_HEIGHT = ''
SET #CN_WIDTH = '' SET #CN_DIMENSION = '' SET #CN_WEIGHT = ''
SET #CN_VOLUME = '' SET #2ndCN_STATUS = '10' SET #CN_MISC7 = ''
SET #CN_MISC8 = '' SET #CN_MISC9 = '' SET #CN_MISC10 = ''
/*GET STORE INFORMATION*/
SELECT #CN_ADDRESS = so_address
, #CN_ADDRESS_1 = so_address_1
, #CN_CITY = so_city
, #CN_STATE = so_state
, #CN_ZIP_CODE = so_zip_code
, #CN_COUNTRY = so_country
FROM STORES
WHERE so_number = #CN_STORE
EXECUTE sp_CREATE_CARTON
#CN_NUMBER , #CN_PICKTICKET , #CN_STORE , #CN_LOAD_NUMBER , #CN_SHIPMENT_NUMBER
, #CN_MANIFEST_NUMBER , #CN_PACKED_QTY , #CN_TRACKING_NUMBER , #CN_TYPE , #CN_PACK_TYPE
, #CN_ROUTE , #CN_SHIP_VIA , #CN_BOL , #CN_MBOL , #CN_PARCEL_NUMBER
, #CN_TRAILER_NUMBER , #CN_AREA , #CN_ZONE , #CN_AISLE , #CN_LEVEL
, #CN_POSITION , #CN_HEIGHT , #CN_WIDTH , #CN_DIMENSION , #CN_WEIGHT
, #CN_VOLUME , #CN_STATUS , #CN_ADDRESS , #CN_ADDRESS_1 , #CN_CITY
, #CN_STATE , #CN_ZIP_CODE , #CN_COUNTRY , #CN_MISC7 , #CN_MISC8
, #CN_MISC9 , #CN_MISC10 , #USER
INSERT INTO CARTON
(
cn_number
)
VALUES
(
#TO_CARTON
)
/*CREATE CARTON DETAIL*/
INSERT INTO CARTON_DETAIL
(
cd_carton_number
)
VALUES
(
#TO_CARTON
)
END
END
--ELSE
-- BEGIN
-- EXECUTE sp_CREATE_ERROR_MESSAGE
-- #ER_TYPE
-- END
GO

--Find the row that is not numeric and fix data
SELECT *
FROM CARTON
WHERE ISNUMERIC(cn_number) != 1 OR
ISNUMERIC(cn_status) != 1
--If you can't fix the data you will need to cast as varchar and compare

Related

Stored Procedure Error on Commit and Begin Statements

ERROR
Transaction count after EXECUTE indicates a mismatching number of BEGIN and COMMIT statements. Previous count = 0, current count = 1.
I get this error in my Stored Procedure that I cannot see where.
ALTER PROCEDURE [dbo].[UpsertServiceTicket]
#TransactionType INT,
#Id INT = NULL,
#CreationDateTime DATETIME = GETDATE,
#Issue VARCHAR(MAX),
#ReportedDateTime DATETIME = NULL,
#ResolutinoDateTime DATETIME = NULL,
#CreatedBy INT = NULL,
#ServiceRequestNumber NVARCHAR(MAX),
#Status VARCHAR(MAX) = NULL,
#IsDeleted BIT = 0,
#LocationId INT,
#SubLocationId INT,
#RequestorId INT,
#ConfirmedBy INT = NULL,
#DepartmentId INT,
#ErrorMessage NVARCHAR(1000) OUTPUT,
#ErrorCode SMALLINT OUTPUT
AS
BEGIN
SET NOCOUNT ON;
BEGIN TRY
BEGIN TRANSACTION
IF (#TransactionType = 0)
INSERT INTO ServiceTickets (
CreationDateTime
, Issue
, ReportedDateTime
, ResolutionDateTime
, CreatedBy
, ServiceRequestNumber
, [Status]
, IsDeleted
, LocationId
, SubLocationId
, RequestorId
, ConfirmerId
, DepartmentId
)
VALUES (
#CreationDateTime
, #Issue
, #ReportedDateTime
, #ResolutinoDateTime
, #CreatedBy
, #ServiceRequestNumber
, #Status
, #IsDeleted
, #LocationId
, #SubLocationId
, #RequestorId
, #ConfirmedBy
, #DepartmentId
)
-- updating the service ticket table
ELSE
UPDATE ServiceTickets
SET CreationDateTime = #CreationDateTime
, Issue = #Issue
, ReportedDateTime = #ReportedDateTime
, ResolutionDateTime = #ResolutinoDateTime
, CreatedBy = #CreatedBy
, ServiceRequestNumber = #ServiceRequestNumber
, [Status] = #Status
, IsDeleted = #IsDeleted
, LocationId = #LocationId
, SubLocationId = #SubLocationId
, RequestorId = #RequestorId
, ConfirmerId = ConfirmerId
, DepartmentId = DepartmentId
WHERE Id = #Id
SET #ErrorMessage = ERROR_MESSAGE()
SET #ErrorCode = ##ERROR
IF (#ErrorCode = 0)
COMMIT TRANSACTION
END TRY
BEGIN CATCH
SET #ErrorMessage = ERROR_MESSAGE()
SET #ErrorCode = ##ERROR;
IF #ErrorCode > 0
ROLLBACK TRANSACTION
END CATCH
END
Use this pattern:
Begin Tran <TransactionName>
BEGIN TRY
--Some Statements
Commit Tran <TransactionName>
END TRY
BEGIN CATCH
DECLARE #Error NVARCHAR(4000)
SET #Error = ERROR_MESSAGE()
ROLLBACK TRAN <TransactionName>
RAISERROR (#Error, 16, 1)
END CATCH
Your error handling code is incorrect, as it does not rollback or commit the transaction in certain cases
It also swallows exceptions and instead returns an error code. You are far better off just letting the error bubble up back to the client. You should use SET XACT_ABORT ON to ensure a rollback.
Given that you are only ever executing one statement, you don't even need a transaction anyway
ALTER PROCEDURE [dbo].[UpsertServiceTicket]
#TransactionType INT,
#Id INT = NULL,
#CreationDateTime DATETIME = NULL,
#Issue VARCHAR(MAX),
#ReportedDateTime DATETIME = NULL,
#ResolutinoDateTime DATETIME = NULL,
#CreatedBy INT = NULL,
#ServiceRequestNumber NVARCHAR(MAX),
#Status VARCHAR(MAX) = NULL,
#IsDeleted BIT = 0,
#LocationId INT,
#SubLocationId INT,
#RequestorId INT,
#ConfirmedBy INT = NULL,
#DepartmentId INT
AS
SET NOCOUNT, XACT_ABORT ON;
SET #CreationDateTime = ISNULL(#CreationDateTime, GETDATE());
IF (#TransactionType = 0)
INSERT INTO ServiceTickets (
CreationDateTime
, Issue
, ReportedDateTime
, ResolutionDateTime
, CreatedBy
, ServiceRequestNumber
, [Status]
, IsDeleted
, LocationId
, SubLocationId
, RequestorId
, ConfirmerId
, DepartmentId
)
VALUES (
#CreationDateTime
, #Issue
, #ReportedDateTime
, #ResolutinoDateTime
, #CreatedBy
, #ServiceRequestNumber
, #Status
, #IsDeleted
, #LocationId
, #SubLocationId
, #RequestorId
, #ConfirmedBy
, #DepartmentId
);
-- updating the service ticket table
ELSE
UPDATE ServiceTickets
SET CreationDateTime = #CreationDateTime
, Issue = #Issue
, ReportedDateTime = #ReportedDateTime
, ResolutionDateTime = #ResolutinoDateTime
, CreatedBy = #CreatedBy
, ServiceRequestNumber = #ServiceRequestNumber
, [Status] = #Status
, IsDeleted = #IsDeleted
, LocationId = #LocationId
, SubLocationId = #SubLocationId
, RequestorId = #RequestorId
, ConfirmerId = ConfirmerId
, DepartmentId = DepartmentId
WHERE Id = #Id;
If you do need a transaction to do a proper Upsert, use this template, with HOLDLOCK, UPDLOCK hints. You do not need a BEGIN CATCH as XACT_ABORT ON will handle the rollback

BizTalk 2013R2 SQL Query Timeouts

Using BizTalk to call a SQL Server stored procedure (see below), which:
Writes data to 5 tables
Checks each table to see if the record exists
Updates or Inserts accordingly
The problem is that when BizTalk receives hundreds of calls, the stored procedure is called each time which appears to add an overhead to the SQL Server and eventually causes timeout errors returned in BizTalk, resulting in the data not being written to the database.
Can anyone advise on the best way to optimise my query so that it processes these tables without much overhead, or have I got it optimised enough already?
USE [MDH]
GO
/****** Object: StoredProcedure [dbo].[spcuPersonStudentProgrammeModule] Script Date: 8/15/2022 2:29:04 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[spcuPersonStudentProgrammeModule]
-- person/personref params
#student_id VARCHAR(max)
,#account_id VARCHAR(max) = NULL
,#prefix_honorific VARCHAR(max) = NULL
,#first_name VARCHAR(max) = NULL
,#middle_name VARCHAR(max) = NULL
,#surname VARCHAR(max) = NULL
,#familiar_name VARCHAR(max) = NULL
,#date_of_birth DATE = NULL
,#external_email_address VARCHAR(max) = NULL
,#mobile_phone_no VARCHAR(max) = NULL
,#gender VARCHAR(max) = NULL
,#ethnicity VARCHAR(max) = NULL
,#domicile VARCHAR(max) = NULL
,#disability VARCHAR(max) = NULL
,#nationality VARCHAR(max) = NULL
,#telephone_no VARCHAR(max) = NULL
,#prev_surname VARCHAR(max) = NULL
,#country_of_birth VARCHAR(max) = NULL
-- student params
,#student_email_address VARCHAR(max) = NULL
,#currently_studying_flag VARCHAR(max) = NULL
,#HesaStudentID VARCHAR(max) = NULL
,#UCAS_ID VARCHAR(max) = NULL
,#uln VARCHAR(max) = NULL
,#VisaReq VARCHAR(max) = NULL
,#PurposeOfResidency VARCHAR(max) = NULL
,#cas_status VARCHAR(max) = NULL
,#student_status VARCHAR(max) = NULL
,#source_system VARCHAR(max) = NULL
,#main_programme_code VARCHAR(max) = NULL
,#type VARCHAR(max) = NULL
,#student_support_no VARCHAR(max) = NULL
,#exam_id VARCHAR(max) = NULL
,#su_opt VARCHAR(max) = NULL
,#change_type VARCHAR(max) = NULL
,#international_sponsored_students varchar(80) = null
,#visa_type VARCHAR(max) = null
-- student_programmes params
,#programme_code VARCHAR(50)
,#programme_description VARCHAR(MAX) = NULL
,#start_date DATETIME = NULL
,#end_date DATETIME = NULL
,#mdh_stage_code VARCHAR(MAX) = NULL
,#main_award_flag VARCHAR(10) = NULL
,#load_category VARCHAR(10) = NULL
,#qualification_level VARCHAR(10) = NULL
,#student_study_level VARCHAR(10) = NULL
,#school_code VARCHAR(10) = NULL
,#college_code VARCHAR(10) = NULL
,#campus_code VARCHAR(10) = NULL
,#graduate_yn VARCHAR(10) = NULL
,#is_wbdl VARCHAR(80) = NULL
,#ul_qual_aim VARCHAR(MAX) = NULL
,#ul_qual_aim_desc VARCHAR(MAX) = NULL
-- student_modules params
,#module_code VARCHAR(50)
,#module_desc VARCHAR(MAX) = NULL
,#mod_date_time DATETIME = NULL
-- student_address params
,#perm_address1 VARCHAR(50) = NULL
,#perm_address2 VARCHAR(50) = NULL
,#perm_address3 VARCHAR(50) = NULL
,#perm_address4 VARCHAR(50) = NULL
,#perm_address5 VARCHAR(50) = NULL
,#perm_postcode VARCHAR(50) = NULL
,#perm_country_code VARCHAR(50) = NULL
,#term_address1 VARCHAR(50) = NULL
,#term_address2 VARCHAR(50) = NULL
,#term_address3 VARCHAR(50) = NULL
,#term_address4 VARCHAR(50) = NULL
,#term_address5 VARCHAR(50) = NULL
,#term_postcode VARCHAR(50) = NULL
,#term_country_code VARCHAR(50) = NULL
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
DECLARE #person_id UNIQUEIDENTIFIER
SET NOCOUNT ON;
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
-- Create/Update person_test/person_reference_test
IF EXISTS ( SELECT person_id FROM dbo.person_reference WHERE account_id = #account_id and ISNULL(status,'') <> 'Delete')
BEGIN
SELECT 'Student exists, updating'
SET #person_id = ( SELECT person_id FROM dbo.person_reference WITH (NOLOCK) WHERE account_id = #account_id and ISNULL(status,'') <> 'Delete')
UPDATE person
SET prefix_honorific = CASE WHEN #prefix_honorific = 'null' or #prefix_honorific is null or #prefix_honorific = '' THEN prefix_honorific ELSE #prefix_honorific END
,first_name = ISNULL(#first_name, first_name)
,middle_name = ISNULL(#middle_name, middle_name)
,surname = ISNULL(#surname, surname)
,familiar_name = #familiar_name
,date_of_birth = ISNULL(#date_of_birth, date_of_birth)
,external_email_address = ISNULL(#external_email_address, external_email_address)
,gender = ISNULL(#gender, gender)
,ethnicity = ISNULL(#ethnicity, ethnicity)
,domicile = ISNULL(#domicile, domicile)
,disability = ISNULL(#telephone_no, disability)
,telephone_no = ISNULL(#telephone_no, telephone_no)
,prev_surname = ISNULL(#prev_surname, prev_surname)
,country_of_birth = ISNULL(#country_of_birth, country_of_birth)
,proc_date_time = GETDATE()
,mobile_phone_no = ISNULL(#mobile_phone_no, mobile_phone_no)
,nationality = ISNULL(#nationality, nationality)
WHERE person_id_guid = #person_id
IF #account_id IS NOT NULL
BEGIN
UPDATE dbo.person_reference
SET account_id = #account_id
,proc_date_time = GETDATE()
WHERE person_id = #person_id
END
END
ELSE
BEGIN
SELECT 'Student does not exist, creating'
--INSERT person
SET #person_id = NEWID()
INSERT INTO dbo.person (
person_id_guid
,prefix_honorific
,first_name
,middle_name
,surname
,familiar_name
,date_of_birth
,external_email_address
,mobile_phone_no
,gender
,ethnicity
,domicile
,disability
,nationality
,telephone_no
,prev_surname
,country_of_birth
,source_system
,proc_date_time
)
VALUES (
#person_id
,#prefix_honorific
,#first_name
,#middle_name
,#surname
,#familiar_name
,#date_of_birth
,#external_email_address
,#mobile_phone_no
,#gender
,#ethnicity
,#domicile
,#disability
,#nationality
,#telephone_no
,#prev_surname
,'OneUni'
,#country_of_birth
,GETDATE()
)
--INSERT person_reference
INSERT INTO dbo.person_reference (
person_id
,student_id
,proc_date_time
,account_id
)
VALUES (
#person_id
,#student_id
,GETDATE()
,#account_id
)
END
-- Create/Update student
IF EXISTS ( SELECT account_id FROM dbo.student WITH (NOLOCK) WHERE account_id = #account_id and ISNULL(status,'') <> 'Delete')
BEGIN
SELECT 'Student exists, updating'
UPDATE student
SET
--account_id = #account_id
--,student_id = #student_id
ucas_id = #UCAS_ID
,unique_learner_number = #uln
,main_programme_code = isnull(#main_programme_code, main_programme_code)
,student_email_address = #student_email_address
,currently_studying_flag = #currently_studying_flag
,hesa_student_id = #HesaStudentID
,visa_required = #VisaReq
,cas_status = #cas_status
,student_status = #student_status
,purpose_of_residency = #PurposeOfResidency
,mod_date_time = GETDATE()
,student_support_no = #student_support_no
,source_system = #source_system
,exam_id = #exam_id
,su_opt = #su_opt
,international_sponsored_students = #international_sponsored_students
,visa_type = #visa_type
WHERE account_id = #account_id
END
-- Create Student/Student Programme/Student Module
ELSE
BEGIN
SELECT 'Student does not exist, creating'
SET #person_id = ( SELECT person_id FROM dbo.person_reference WITH (NOLOCK) WHERE account_id = #account_id and ISNULL(status,'') <> 'Delete')
INSERT INTO student (
person_id_guid
,account_id
,ucas_id
,unique_learner_number
,student_email_address
,currently_studying_flag
,hesa_student_id
,visa_required
,cas_status
,student_status
,purpose_of_residency
,proc_date_time
,source_system
,main_programme_code
,student_id
,student_support_no
,exam_id
,su_opt
,international_sponsored_students
,visa_type
)
VALUES (
#person_id
,#account_id
,#UCAS_ID
,#uln
,#student_email_address
,#currently_studying_flag
,#HesaStudentID
,#VisaReq
,#cas_status
,#student_status
,#PurposeOfResidency
,getdate()
,#source_system
,#main_programme_code
,#student_id
,#student_support_no
,#exam_id
,#su_opt
,#international_sponsored_students
,#visa_type
)
END
-- Create/Update student_programmes if change_record is 'Course'
IF #change_type = 'Programme'
BEGIN
-- Create/Update student_programmes
IF EXISTS ( SELECT student_id FROM student_programmes WITH (NOLOCK) WHERE account_id = #account_id and programme_code = #programme_code)
BEGIN
SELECT 'Student Programme exists, updating'
--UPDATE student_programme? (Wait for confirmation)
UPDATE student_programmes
SET
--account_id = #account_id
--,student_id = #student_id
--course_code = #course_code
programme_description = #programme_description
,[start_date] = #start_date
,end_date = #end_date
,mdh_stage_code = #mdh_stage_code
,main_award_flag = #main_award_flag
,load_category = #load_category
,qualification_level = #qualification_level
,student_study_level = #student_study_level
,is_wbdl = #is_wbdl
,school_code = #school_code
,college_code = #college_code
,campus_code = #campus_code
,ul_qual_aim = #ul_qual_aim
,ul_qual_aim_description = #ul_qual_aim_desc
,mod_date_time = GETDATE()
WHERE account_id = #account_id
and programme_code = #programme_code
END
ELSE
BEGIN
SELECT 'Student Programme does not exist, creating'
SET #person_id = ( SELECT person_id FROM dbo.person_reference WITH (NOLOCK) WHERE account_id = #account_id and ISNULL(status,'') <> 'Delete')
--INSERT student_programme
INSERT INTO student_programmes (
person_id_guid
,account_id
,student_id
,programme_code
,programme_description
,[start_date]
,end_date
,mdh_stage_code
,main_award_flag
,load_category
,qualification_level
,student_study_level
,is_wbdl
,school_code
,college_code
,campus_code
,ul_qual_aim
,ul_qual_aim_description
,mod_date_time
)
VALUES (
#person_id
,#account_id
,#student_id
,#programme_code
,#programme_description
,#start_date
,#end_date
,#mdh_stage_code
,#main_award_flag
,#load_category
,#qualification_level
,#student_study_level
,#is_wbdl
,#school_code
,#college_code
,#campus_code
,#ul_qual_aim
,#ul_qual_aim_desc
,GETDATE()
)
END
END
-- Create/Update student_modules if change_record is 'Module'
IF #change_type = 'Module'
BEGIN
IF EXISTS ( SELECT student_id FROM student_modules WITH (NOLOCK) WHERE account_id = #account_id and programme_code = #programme_code and module_code = #module_code)
BEGIN
SELECT 'Student Module exists, updating'
--UPDATE student_module? (Wait for confirmation)
UPDATE student_modules
SET
--account_id = #account_id
--,student_id = #student_id
--course_code = #course_code
--module_code = #module_code
module_description = #module_desc
,mdh_stage_code = #mdh_stage_code
,student_study_level = #student_study_level
,mod_date_time = GETDATE()
WHERE account_id = #account_id
and programme_code = #programme_code
and module_code = #module_code
END
ELSE
BEGIN
SELECT 'Student Module does not exist, creating'
SET #person_id = ( SELECT person_id FROM dbo.person_reference WITH (NOLOCK) WHERE account_id = #account_id and ISNULL(status,'') <> 'Delete')
-- If the programme for the module/student doesnt exist, insert it
IF NOT EXISTS ( SELECT student_id FROM dbo.student_programmes WITH (NOLOCK) WHERE account_id = #account_id and programme_code = #programme_code)
BEGIN
SET #person_id = ( SELECT person_id FROM dbo.person_reference WITH (NOLOCK) WHERE account_id = #account_id )
--INSERT student_programme
INSERT INTO student_programmes (
person_id_guid
,account_id
,student_id
,programme_code
,programme_description
,[start_date]
,end_date
,mdh_stage_code
,main_award_flag
,load_category
,qualification_level
,student_study_level
,is_wbdl
,school_code
,college_code
,campus_code
,ul_qual_aim
,ul_qual_aim_description
,mod_date_time
)
VALUES (
#person_id
,#account_id
,#student_id
,#programme_code
,#programme_description
,#start_date
,#end_date
,#mdh_stage_code
,#main_award_flag
,#load_category
,#qualification_level
,#student_study_level
,#is_wbdl
,#school_code
,#college_code
,#campus_code
,#ul_qual_aim
,#ul_qual_aim_desc
,GETDATE()
)
END
--INSERT student_module
INSERT INTO student_modules (
person_id_guid
,account_id
,student_id
,programme_code
,module_code
,module_description
,mdh_stage_code
,student_study_level
,mod_date_time
)
VALUES (
#person_id
,#account_id
,#student_id
,#programme_code
,#module_code
,#module_desc
,#mdh_stage_code
,#student_study_level
,GETDATE()
)
END
END
END

Stored procedure with OUTPUT - Must declare the scalar variable

I'm writing a stored procedure that will be executed from C# to get data from database. Therefore I have to pass a GUID to this stored procedure and it should find data in table Contact or in the Lead table & return data back to C# app via output parameters.
When I try to execute this stored procedure in SSMS, I get a SQL exception
Must declare the scalar variable "#LastName"
Code:
ALTER PROCEDURE [api].[GetUser_NetId]
#NetId uniqueidentifier
, #LastName nvarchar(200) = '' OUTPUT
, #FirstName nvarchar(200) = '' OUTPUT
, #Country uniqueidentifier = NULL OUTPUT
, #Newsletter bit = 0 OUTPUT
AS
DECLARE
#Table SMALLINT
SET #Table = (
SELECT MIN(T.ID) FROM (
SELECT 100 AS [ID] FROM dbo.Contact WHERE Net_ID = #NetId
UNION ALL
SELECT 200 AS [ID] FROM dbo.Lead WHERE Net_ID = #NetId
) T
)
DECLARE #SQL NVARCHAR(MAX)
SET #SQL = CONCAT(
' SELECT
#LastName = tbl.LastName,
#FirstName = tbl.FirstName,
#Country = tbl.Address1CountryId,
#Newsletter = tbl.Newsletter,
FROM
dbo.'
, CASE #Table
WHEN 100 THEN 'Contact'
WHEN 200 THEN 'Lead'
END
, ' as tbl
WHERE 1=1
AND tbl.Net_Id = '''
, #NetId
, ''''
)
EXEC(#SQL)
..a slightly simpler approach
ALTER PROCEDURE [api].[GetUser_NetId]
#NetId uniqueidentifier
, #LastName nvarchar(200) = '' OUTPUT
, #FirstName nvarchar(200) = '' OUTPUT
, #Country uniqueidentifier = NULL OUTPUT
, #Newsletter bit = 0 OUTPUT
AS
BEGIN
IF EXISTS(SELECT * FROM dbo.Contact WHERE Net_ID = #NetId)
BEGIN
SELECT
#LastName = tbl.LastName,
#FirstName = tbl.FirstName,
#Country = tbl.Address1CountryId,
#Newsletter = tbl.Newsletter
FROM dbo.Contact WHERE Net_ID = #NetId;
END
ELSE
BEGIN
SELECT
#LastName = tbl.LastName,
#FirstName = tbl.FirstName,
#Country = tbl.Address1CountryId,
#Newsletter = tbl.Newsletter
FROM dbo.Lead WHERE Net_ID = #NetId;
END
END
I am getting an error like:
Msg 137, Level 15, State 2, Line 18
Must declare the scalar variable "#CustomerKey".
Msg 137, Level 15, State 1, Line 21
Must declare the scalar variable "#FirstName".
Msg 137, Level 15, State 1, Line 30
Must declare the scalar variable "#FirstName".
IF EXISTS(SELECT * FROM VW_FactInternetSales WHERE CustomerKey = #CustomerKey)
BEGIN
SELECT
#FirstName = .FirstName,
#TaxAmt = .TaxAmt,
#Country = .Country,
#CustomerKey = .CustomerKey
FROM DimCustomer WHERE CustomerKey = #CustomerKey
END
ELSE
BEGIN
SELECT
#FirstName = .FirstName,
#TaxAmt = .TaxAmt,
#Country = .Country,
#CustomerKey = .CustomerKey
FROM VW_FactInternetSales WHERE CustomerKey = #CustomerKey
END
END
I cant add my table in this line
#FirstName = .FirstName,
#TaxAmt = .TaxAmt,
#Country = .Country,
#CustomerKey = .CustomerKey

Sql Scope_Identity() return Null?

I am facing this issue that my stored proc always return NULL though i have set my #output variable as well.I want to get last inserted scope Id from the table.
can someone help me where i have got wrong?
ALTER PROC spAddOrUpdateMember
#pMemberId INT = 0 ,
#pFirstName VARCHAR(50) = 'aa',
#pLastName VARCHAR(50)='aa' ,
#pMemberCode VARCHAR(15) = '12312',
#pDOB DATE = '03/10/2019',
#pGrade INT = 2 ,
#pCNIC VARCHAR(14) = '3423434',
#pFatherName VARCHAR(50) = 'asdasd' ,
#pCurrentAddress VARCHAR(MAX) = 'asds' ,
#pPermanentAddress VARCHAR(MAX) = 'fgdf',
#pEmploymentAddress VARCHAR(MAX) = 'ytuyu' ,
#pNationality INT =2
#output int = 0 output
AS
BEGIN
IF #pMemberId > 0
BEGIN
---UPDATE ME
UPDATE [dbo].[QC_Member_Profile]
SET
[FirstName] = #pFirstName
,[LastName] = #pLastName
,[DOB] = #pDOB
,[CNIC] = #pCNIC
,[FatherName] = #pFatherName
,[CurrentAddress] = #pCurrentAddress
,[PermanentAddress] = #pPermanentAddress
,[Nationality] = #pNationality
,[MemberTypeId] =#pMemberTypeId
WHERE MemberId = #pMemberId
END
ELSE
BEGIN
---INSERT ME
INSERT INTO QC_Member_Profile VALUES(
dbo.PIdentityKey(0),
#pFirstName,
#pLastName,
#pDOB,
#pCNIC,
#pFatherName,
#pCurrentAddress,
#pPermanentAddress,
#pNationality,
)
set #output = SCOPE_IDENTITY();
SELECT #output = SCOPE_IDENTITY();
select #output
END
END
I've guessed the name of your ID column, however, this should work. You'll need to amend the name of your ID column if it isn't called MemberID or if it doesn't have the data type int:
ALTER PROC spAddOrUpdateMember #pMemberId int = 0,
#pFirstName varchar(50) = 'aa',
#pLastName varchar(50) = 'aa',
#pMemberCode varchar(15) = '12312',
#pDOB date = '03/10/2019',
#pGrade int = 2,
#pCNIC varchar(14) = '3423434',
#pFatherName varchar(50) = 'asdasd',
#pCurrentAddress varchar(MAX) = 'asds',
#pPermanentAddress varchar(MAX) = 'fgdf',
#pEmploymentAddress varchar(MAX) = 'ytuyu',
#pNationality int = 2,
#output int = 0 OUTPUT
AS
BEGIN
IF #pMemberId > 0
BEGIN
UPDATE [dbo].[QC_Member_Profile]
SET [FirstName] = #pFirstName,
[LastName] = #pLastName,
[DOB] = #pDOB,
[CNIC] = #pCNIC,
[FatherName] = #pFatherName,
[CurrentAddress] = #pCurrentAddress,
[PermanentAddress] = #pPermanentAddress,
[Nationality] = #pNationality,
[MemberTypeId] = #pMemberTypeId
WHERE MemberId = #pMemberId;
END;
ELSE
BEGIN
DECLARE #ins table (OutputID int);
INSERT INTO QC_Member_Profile
OUTPUT Inserted.MemberID --guessed name
INTO #Ins
VALUES (dbo.PIdentityKey(0), #pFirstName, #pLastName, #pDOB, #pCNIC, #pFatherName, #pCurrentAddress, #pPermanentAddress, #pNationality);
SELECT #output = OutputID
FROM #ins;
SELECT #Output;
END;
END;
I've also fixed the syntax errors that were in your original question.

Stored Procedure values not insert XML node

Stored procedure:
ALTER proc [dbo].[Equip_SaveTeamTaskAssigineeDetails] (
#saveDataXML xml)
as
begin
Declare #claimid int,
#createdate datetime,
#duedate datetime,
#startdate datetime,
#assignmentid int,
#assignedto varchar(50),
#piority varchar(50),
#comment varchar(4000)
select #claimid = node.value('claimid[1]','int'),
#createdate = node.value('createdate[1]','datetime'),
#duedate = node.value('duedate[1]','datetime'),
#startdate = node.value('startdate[1]','datetime'),
#assignmentid = node.value('assignmentid[1]','int'),
#assignedto = node.value('assignedto[1]','varchar(50)'),
#piority= node.value('piority[1]','varchar(50)'),
#comment = node.value('comment[1]','varchar(4000)')
from #saveDataXML.nodes('/TeamTaskDetails/Task') nodes(node)
IF (#claimid = 0)
BEGIN
INSERT INTO [dbo].[TeamTaskAssiginment]
([claimid],
[createdate],
[duedate],
[startdate],
[assignedid],
[assiginedto],
[priority],
[comment])
VALUES
(#claimid,
#createdate,
#duedate,
#startdate ,
#assignmentid ,
#assignedto ,
#piority ,
#comment
)
--SET #claimid = SCOPE_IDENTITY()
END
ELSE
BEGIN
Update [dbo].[TeamTaskAssiginment] set
claimid=#claimid ,
createdate=#createdate,
duedate=#duedate,
startdate=#startdate,
assignedid=#assignedto,
assiginedto=#assignedto,
priority=#piority,
comment=#comment
END
Execute Stored Procedure
Exec Equip_SaveTeamTaskAssigineeDetails #saveDataXML =
<TeamTaskDetails>
<Task claimid="1" createdate="2000-12-16" duedate="2000-12-16" startdate="2000-12-16" assignmentid="1" assignedto="test" piority="HIGH" comment="test" />
</TeamTaskDetails>
If I executed Stored Procedure its showing 0 Rows Affected values not inserting
Please help to resolve the issue.
You're querying the xml wrong, to get the attribute values you need to query it like so, replacing claimid[1]:
SELECT #claimid = node.value('#claimid', 'int') ,....
Full sample:
DECLARE #saveDataXML AS XML =
'<TeamTaskDetails>
<Task claimid="1" createdate="2000-12-16" duedate="2000-12-16"
startdate="2000-12-16" assignmentid="1" assignedto="test"
piority="HIGH" comment="test" />
</TeamTaskDetails>'
DECLARE #claimid INT ,
#createdate DATETIME ,
#duedate DATETIME ,
#startdate DATETIME ,
#assignmentid INT ,
#assignedto VARCHAR(50) ,
#piority VARCHAR(50) ,
#comment VARCHAR(4000)
SELECT #claimid = node.value('#claimid', 'int') ,
#createdate = node.value('#createdate', 'datetime') ,
#duedate = node.value('#duedate', 'datetime') ,
#startdate = node.value('#startdate', 'datetime') ,
#assignmentid = node.value('#assignmentid', 'int') ,
#assignedto = node.value('#assignedto', 'varchar(50)') ,
#piority = node.value('#piority', 'varchar(50)') ,
#comment = node.value('#comment', 'varchar(4000)')
FROM #saveDataXML.nodes('/TeamTaskDetails/Task') nodes ( node )
SELECT claimid = #claimid ,
createdate = #createdate ,
duedate = #duedate ,
startdate = #startdate ,
assignedid = #assignedto ,
assiginedto = #assignedto ,
priority = #piority ,
comment = #comment
Ouput:
claimid createdate duedate startdate assignedid....
1 2000-12-16 2000-12-16 2000-12-16 test...
Also, as I commented, the insert isn't hit because your current select is returning nulls, so IF (#claimid = 0) won't return true. And your update query will update every row unless you specify a where clause.
There no END for the BEGIN Statement.
Please try this code
ALTER proc [dbo].[Equip_SaveTeamTaskAssigineeDetails] (
#saveDataXML xml)
AS
BEGIN
Declare #claimid int,
#createdate datetime,
#duedate datetime,
#startdate datetime,
#assignmentid int,
#assignedto varchar(50),
#piority varchar(50),
#comment varchar(4000)
select #claimid = node.value('claimid[1]','int'),
#createdate = node.value('createdate[1]','datetime'),
#duedate = node.value('duedate[1]','datetime'),
#startdate = node.value('startdate[1]','datetime'),
#assignmentid = node.value('assignmentid[1]','int'),
#assignedto = node.value('assignedto[1]','varchar(50)'),
#piority= node.value('piority[1]','varchar(50)'),
#comment = node.value('comment[1]','varchar(4000)')
from #saveDataXML.nodes('/TeamTaskDetails/Task') nodes(node)
IF (#claimid = 0) BEGIN
INSERT INTO [dbo].[TeamTaskAssiginment]
([claimid],
[createdate],
[duedate],
[startdate],
[assignedid],
[assiginedto],
[priority],
[comment])
VALUES
(#claimid,
#createdate,
#duedate,
#startdate ,
#assignmentid ,
#assignedto ,
#piority ,
#comment
)
--SET #claimid = SCOPE_IDENTITY()
END ELSE BEGIN
Update [dbo].[TeamTaskAssiginment] set
claimid=#claimid ,
createdate=#createdate,
duedate=#duedate,
startdate=#startdate,
assignedid=#assignedto,
assiginedto=#assignedto,
priority=#piority,
comment=#comment
END
END
GO
Also check the XML code. It should be in a single inverted comma :
-- Execute Stored Procedure
Exec Equip_SaveTeamTaskAssigineeDetails #saveDataXML =
'<TeamTaskDetails>
<Task claimid="1" createdate="2000-12-16" duedate="2000-12-16" startdate="2000-12-16" assignmentid="1" assignedto="test" piority="HIGH" comment="test" />
</TeamTaskDetails>'