为什么它显示在sql server中将数据类型varchar转换为int?

时间:2014-10-31 12:19:21

标签: sql-server tsql stored-procedures

**

  

我在sql-server 2008中创建了一个用于搜索的存储过程   目的,下面的代码表示我的存储过程,在执行时   存储过程它给出了错误,如转换失败varchar到数据   输入int

**

ALTER PROCEDURE [dbo].[SUMMARY_DETAILS_PROJECT_SEARCH_MAP]

@PROJECT_CAT                    INT=NULL,
@PROJECT_TYPE                   INT=NULL,
@ADDRESS                        VARCHAR(150)=NULL,
@MIN_PRICE                      INT=NULL,
@MAX_PRICE                      INT=NULL,
@BEDROOM                        VARCHAR(150)=NULL
AS

CREATE TABLE #TEMP_MAP
 (
 SN                     INT IDENTITY,
 PROJECT_ID             INT,
 PROJECT_NAME           VARCHAR(100),
 LAT                    VARCHAR(50),
 LONG                   VARCHAR(50),
 PROJECT_LOC            VARCHAR(150),
 MIN_PRICE              VARCHAR(100),
 MAX_PRICE              VARCHAR(100),
 PROJECT_IMAGE          VARCHAR(250)
 )
 DECLARE @SQL NVARCHAR(MAX),@PARAMETER_LIST NVARCHAR(MAX)  
 DECLARE @COUNT_ZONE        INT
 DECLARE @COUNT_CITY        INT

 SELECT @COUNT_ZONE= (SELECT COUNT(*) FROM ZONE_MASTER WHERE ZONE_NAME LIKE @ADDRESS + '%')
 SELECT @SQL    =   ('SELECT PROJECT_ID FROM PROJECTS WHERE STATUS=1') 
 IF(@PROJECT_CAT !=0)  
 SELECT @SQL    =   @SQL+' AND PROJECT_CAT_ID=@XP_PROJECT_CAT'  
 IF(@PROJECT_TYPE !=0)
 SELECT @SQL    =   @SQL+' AND  PROJECT_TYPE_ID=@XP_PROJECT_TYPE'
 IF(@COUNT_ZONE !=0)
 SELECT @SQL    =   @SQL+' AND ZONE_ID IN (SELECT ZONE_ID FROM ZONE_MASTER WHERE ZONE_NAME LIKE '''+@ADDRESS+''' + ''%'')'
 ELSE
 SELECT @SQL    =   @SQL+' AND BLOCK_ID IN (SELECT BLOCK_ID FROM BLOCK_MASTER WHERE BLOCK_NAME LIKE '''+@ADDRESS+''' + ''%'')'
 IF(@MIN_PRICE !=0)
 SELECT @SQL    =   @SQL+' AND MIN_ID >=@XP_MIN_PRICE'
 IF(@MAX_PRICE !=0)
 SELECT @SQL    =   @SQL+' AND MAX_ID <=@XP_MAX_PRICE'
 IF(@BEDROOM !='')
 SELECT @SQL    =   @SQL+' AND BEDROOM=@XP_BEDROOM'

 SELECT @SQL    =   @SQL + ' ORDER BY PROJECT_ENTRY_DATE DESC '
 SELECT @PARAMETER_LIST =   '@XP_PROJECT_CAT INT,@XP_PROJECT_TYPE INT,@XP_MIN_PRICE INT,@XP_MAX_PRICE INT,@XP_BEDROOM VARCHAR(100)'


INSERT INTO #TEMP_MAP (PROJECT_ID)
EXEC SP_EXECUTESQL @SQL,@PARAMETER_LIST,'@XP_PROJECT_CAT','@XP_PROJECT_TYPE','@XP_MIN_PRICE','@XP_MAX_PRICE','@XP_BEDROOM'

PRINT @SQL

UPDATE #TEMP_MAP SET
PROJECT_NAME        =   P.PROJECT_NAME,
LAT                 =   P.PROJECT_LAT,
LONG                =   P.PROJECT_LONG,
PROJECT_LOC         =   P.PROJECT_LOC,
MIN_PRICE           =   P.MAX_PRICE,
MAX_PRICE           =   P.MIN_PRICE,
PROJECT_IMAGE       =   './UploadImage/Upload_Project/' + P.PROJECT_NAME +'/' + 'Google' + '/' + [IMG1]
FROM Projects P WHERE P.PROJECT_ID=#TEMP_MAP.PROJECT_ID

SELECT * FROM #TEMP_MAP

DROP TABLE #TEMP_MAP

1 个答案:

答案 0 :(得分:1)

这是因为你在传递给sp_executesql的值周围加上单引号,例如:

EXEC SP_EXECUTESQL @SQL,@PARAMETER_LIST,'@XP_PROJECT_CAT'

这里你没有传递@XP_PROJECT_CAT的整数值,但是你传递了字符串'@XP_PROJECT_CAT',并且该过程期望一个int。

顺便说一句,我不确定为什么你选择除地址之外的所有参数?当然,参数化也是有意义的 - 例如。

IF(@COUNT_ZONE !=0)
    SELECT @SQL = @SQL+' AND ZONE_ID IN (SELECT ZONE_ID 
                                        FROM ZONE_MASTER 
                                        WHERE ZONE_NAME LIKE @ADDRESS + ''%'')'
ELSE
    SELECT @SQL = @SQL+' AND BLOCK_ID IN (SELECT BLOCK_ID 
                                        FROM BLOCK_MASTER 
                                        WHERE BLOCK_NAME LIKE @ADDRESS + ''%'')'

然后将@Address作为参数添加到sp_executesql