存储过程返回错误 [英] Stored Procedure returns error

查看:85
本文介绍了存储过程返回错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我创建了一个存储过程,用于从excel文件导入存储到临时表中,并根据关系表中提供的关系更新某些字段。

我还在苦苦挣扎

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

EXEC(@QUERY)

返回我的结果以进行下一次处理。但由于EXEC导致退出sp,因此无法使用它。我希望该查询的结果可以进一步处理。请让我知道....



这是我更新的SP



/ ******对象:StoredProcedure [dbo]。[sp_test]脚本日期:01/07/2014 09:31:47 ****** /

SET ANSI_NULLS ON

GO

SET QUOTED_IDENTIFIER ON

GO

- 通过调试器提交的批处理: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

设置NOCOUNT ON;

- 创建临时表保持EXCEL表中的价值 -



创建表#CUSTOMER_TBL(

tbl_row_id int identity(1,1)主键,

CUSTOMER_ID INT,

LINK_ID INT,

LOAN_NO BIGINT,

CUST_NAME VARCHAR(15),

优秀的浮动,

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,FIN AL_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)')



来自@ XML_CUSTOMER.nodes('/ root / row')作为CUST_TEMP(项目)

- 从DUMP_RELATION中获取关系 -





CREATE TABLE #TEMP(

TEMP_ROW_ID int identity(1,1)主键,

DUMP_FIELD VARCHAR (20))





INSERT INTO #TEMP(DUMP_FIELD)

从DUMP_RELATION选择DUMP_FIELD


- TRUNCATE TABLE #TEMP



- 使用环路时 -



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)来自#TEMP



WHILE(@ Ind< = @ RECORD)



BEGIN



SET @ DUMP_FIELD =(SELECT DUMP_FIELD FROM #TEMP WHERE TEMP_ROW_ID = @ Ind)

SET @ REFER_FIELD =( SELECT DUFER_FIELD FROM DUMP_RELATION WHERE DUMP_FIELD = @ DUMP_FIELD)

SET @ TABLE =(SELECT DUFER_ABLE来自DUMP_RELATION 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

- 通过表格中的栏目 -

WHILE(@ Index< = @ RecordCnt)



BEGIN



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





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





IF @RESULT IS NOT NULL



BEGIN

- 创建表#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_VALU E)







- 使用所获得的价值购买----





EXEC('更新#CUSTOMER_TBL设置#CUSTOMER_TBL.'+@DUMP_FIELD+'='+ @ COUNT +'WHERE tbl_row_id ='+ @ Index)< br $>




结束



- ELSE



- 开始

- 来自@ QUERY = N'INSERT INTO'+ QUOTENAME(@TABLE_NAME)+'VALUES'+(@ DUMP_VALUE)

--EXEC(@QUERY)

- 结束





SET @ Index = @ Index + 1

END





SET @Ind = @Ind + 1

结束

--SELECT @COUNT

--SELECT * FROM #CUSTOMER_TBL



END < br $>




DROP TABLE #TEMP

DROP TABLE #CUSTOMER_TBL











请复制任何人都知道.....

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

推荐答案

我敢打赌这一行导致错误。你的WHERE子句没有做任何事情所以它试图将所有@DUMP_FIELD值分配给@DUMP_VALUE



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) 


这篇关于存储过程返回错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆