**
我在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
答案 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