Click here to Skip to main content
15,881,882 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:
I have created an stored procedure to import from excel file to store into a temporary table and update certain fields based on the relation provided in the relationship table.
I'm still struggling with
SET @QUERY=N'SELECT '+@FIELD+'FROM '+QUOTENAME(@TABLE_NAME )+'WHERE '+@REFER_FIELD+'='+@DUMP_VALUE+''
EXEC(@QUERY)
Returns my result for the next processing .but it cannot be used since the EXEC cause to exit from sp.I want the result from that query for further processing.Please let me know anyway....

Here is my updated SP

/****** Object: StoredProcedure [dbo].[sp_test] Script Date: 01/07/2014 09:31:47 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- Batch submitted through debugger: SQLQuery1.sql|7|0|C:\Users\Accity\AppData\Local\Temp\~vs3E5F.sql
ALTER procedure [dbo].[sp_test] @DUMP_FIELD VARCHAR(20)='',@FIELD NCHAR(20)='' OUTPUT,@REFER_FIELD NCHAR(20)='' OUTPUT,@TABLE NCHAR(20)='' OUTPUT,@FLAG INT=0,
@TABLE_NAME SYSNAME='',@DUMP_VALUE VARCHAR(20)='',@XML_CUSTOMER XML='',@TBL NVARCHAR(MAX)=''


AS

BEGIN
SET NOCOUNT ON;
--CREATING TEMPORARY TABLE TO HOLD THE VALUES FROM THE EXCEL SHEET--

CREATE TABLE #CUSTOMER_TBL(
tbl_row_id int identity(1,1)primary key,
CUSTOMER_ID INT,
LINK_ID INT,
LOAN_NO BIGINT,
CUST_NAME VARCHAR(15),
OUTSTANDING FLOAT,
FINAL_POSITION FLOAT,
NATION_NAME VARCHAR(20),
COMPANY VARCHAR(15),
BANK_NAME VARCHAR(20),
PHONE_RES VARCHAR(15),
PHONE_OFFICE VARCHAR(15),
MOBILE VARCHAR(15),
FAX VARCHAR(15),
PASSPORT_NUMBER VARCHAR(50),
EMAIL VARCHAR(25),
DOB VARCHAR(30)
)

INSERT INTO #CUSTOMER_TBL(CUSTOMER_ID,LINK_ID,LOAN_NO,CUST_NAME,OUTSTANDING,FINAL_POSITION,NATION_NAME,COMPANY,BANK_NAME,PHONE_RES,PHONE_OFFICE,MOBILE,FAX,PASSPORT_NUMBER,EMAIL,DOB)
SELECT
CUST_TEMP.Item.value('@cust_id', 'INT'),
CUST_TEMP.Item.value('@link_id', 'INT'),
CUST_TEMP.Item.value('@loan_no', 'BIGINT'),
CUST_TEMP.Item.value('@cust_name', 'VARCHAR(15)'),
CUST_TEMP.Item.value('@out_standing', 'FLOAT'),
CUST_TEMP.Item.value('@final_pos', 'FLOAT'),
CUST_TEMP.Item.value('@nation_code', 'NVARCHAR(MAX)'),
CUST_TEMP.Item.value('@company', 'VARCHAR(15)'),
CUST_TEMP.Item.value('@bank_code', 'NVARCHAR(MAX)'),
CUST_TEMP.Item.value('@ph_res', 'VARCHAR(15)'),
CUST_TEMP.Item.value('@ph_office', 'VARCHAR(15)'),
CUST_TEMP.Item.value('@mobile', 'VARCHAR(15)'),
CUST_TEMP.Item.value('@fax', 'VARCHAR(15)'),
CUST_TEMP.Item.value('@pass_port', 'VARCHAR(50)'),
CUST_TEMP.Item.value('@email', 'VARCHAR(25)'),
CUST_TEMP.Item.value('@dob', 'VARCHAR(30)')

FROM @XML_CUSTOMER.nodes('/root/row') as CUST_TEMP(Item)
--SELECTING RELATION FROM DUMP_RELATION--


CREATE TABLE #TEMP(
TEMP_ROW_ID int identity(1, 1) primary key,
DUMP_FIELD VARCHAR(20))


INSERT INTO #TEMP(DUMP_FIELD)
SELECT DUMP_FIELD FROM DUMP_RELATION

--TRUNCATE TABLE #TEMP

--ITERATING USING THE WHILE LOOP--

DECLARE @RECORD INT
DECLARE @Ind INT
DECLARE @Index INT
DECLARE @RecordCnt INT
DECLARE @QUERY AS NVARCHAR(MAX)
DECLARE @sql AS NVARCHAR(MAX)
DECLARE @RESULT NVARCHAR(MAX)
DECLARE @COUNT AS VARCHAR(20)

SELECT @Ind=1

SELECT @RECORD=COUNT(DUMP_FIELD) FROM #TEMP

WHILE(@Ind<=@RECORD)

BEGIN

SET @DUMP_FIELD=(SELECT DUMP_FIELD FROM #TEMP WHERE TEMP_ROW_ID=@Ind)
SET @REFER_FIELD=(SELECT REFER_FIELD FROM DUMP_RELATION WHERE DUMP_FIELD=@DUMP_FIELD)
SET @TABLE=(SELECT REFER_TABLE FROM DUMP_RELATION WHERE DUMP_FIELD=@DUMP_FIELD)
SET @FIELD=(SELECT RETURN_FIELD FROM DUMP_RELATION WHERE REFER_TABLE=@TABLE AND REFER_FIELD=@REFER_FIELD)
SET @TABLE_NAME=@TABLE


SELECT @RecordCnt = COUNT(*) FROM #CUSTOMER_TBL
SELECT @Index = 1
--ITERAING THROUGH THE COLUMNS IN THE TABLE--
WHILE(@Index<=@RecordCnt)

BEGIN

SET @DUMP_VALUE=(SELECT @DUMP_FIELD FROM #CUSTOMER_TBL WHERE tbl_row_id=@Index)


SET @RESULT=N'SELECT * FROM '+QUOTENAME(@TABLE_NAME)+' WHERE '+@REFER_FIELD+'='+@DUMP_VALUE+''


IF @RESULT IS NOT NULL

BEGIN
-- CREATE TABLE #TEMMMP(
-- FIELD VARCHAR(20))
--SET @sql=N'SELECT * INTO #TEMMMP FROM '+QUOTENAME(@TABLE_NAME)+'WHERE '+@REFER_FIELD+'='+@DUMP_VALUE+''
--EXEC (@sql)
--SELECT * FROM #TEMMMP
--DROP TABLE #TEMMMP

SET @QUERY=N'SELECT '+@FIELD+'FROM '+QUOTENAME(@TABLE_NAME)+' WHERE '+@REFER_FIELD+'='+@DUMP_VALUE+''

EXEC sp_executesql @COUNT= @QUERY
--SELECT @COUNT


--(SELECT @FIELD FROM QUOTENAME(@TABLE_NAME) WHERE @REFER_FIELD = @DUMP_VALUE )



--UPDATING WITH THE VALUE OBTAINED----


EXEC('UPDATE #CUSTOMER_TBL SET #CUSTOMER_TBL.'+@DUMP_FIELD+'= '+@COUNT +' WHERE tbl_row_id='+@Index)


END

-- ELSE

--BEGIN
--SET @QUERY=N'INSERT INTO '+QUOTENAME(@TABLE_NAME)+' VALUES '+(@DUMP_VALUE)
--EXEC(@QUERY)
-- END


SET @Index=@Index+1
END


SET @Ind=@Ind+1
END
--SELECT @COUNT
--SELECT * FROM #CUSTOMER_TBL

END


DROP TABLE #TEMP
DROP TABLE #CUSTOMER_TBL





Please replay anyone knows.....
Posted
Updated 6-Jan-14 22:16pm
v4
Comments
Kornfeld Eliyahu Peter 6-Jan-14 3:05am    
Just a bit of advice...
Inside a SP do not use create table #table_name, but declare a table variable using declare @table_name table.
http://technet.microsoft.com/en-us/library/ms188927(v=sql.100).aspx
It's much better as SQL will handle for you the scope so not drop will be necessary...
ZurdoDev 6-Jan-14 8:03am    
Actually, last week I was testing a SP using @tableVariable and it was very, very slow. I changed it to a #temp table and it improved performance greatly. I had no idea they would be that different.
Kornfeld Eliyahu Peter 6-Jan-14 8:13am    
Yes. It's known for large number of rows stored in table variables. The source of this the optimizer that compiles your SP with estimated row 1(!), while at runtime you may have thousands...
You can try option recompile on SPs with table variable, that should do the trick...
Kornfeld Eliyahu Peter 6-Jan-14 3:06am    
As you told the SP work fine alone, the error occures only when running from code - you may paste here the code running the SP? It's possible, that the problem is there and not in the SP...
jeffin_ 7-Jan-14 4:06am    
I have solve that issue...but still struggling with
SET @QUERY=N'SELECT '+@FIELD+'FROM '+QUOTENAME(@TABLE_NAME )+'WHERE '+@REFER_FIELD+'='+@DUMP_VALUE+''
EXEC(@QUERY)

Returns my result for the next processing .but it cannot be used since the EXEC cause to exit from sp.I want the result from that query for further processing.Please let me know anyway....

1 solution

I will bet that this line is causing the error. Your WHERE clause is not doing anything so it is trying to assign All the @DUMP_FIELD values to @DUMP_VALUE

SET @DUMP_VALUE=(SELECT @DUMP_FIELD FROM #CUSTOMER_TBL WHERE 1=1) 
 
Share this answer
 
Comments
jeffin_ 7-Jan-14 4:08am    
SET @DUMP_VALUE=(SELECT @DUMP_FIELD FROM #CUSTOMER_TBL WHERE 1=1)

I have rectified this issue by using indexing.thanks for helping on this
bowlturner 7-Jan-14 9:10am    
No problem!

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900