2014-10-31 112 views
-1

**爲什麼在sql server中顯示將數據類型varchar轉換爲int?

我在做2008年的SQL Server中的存儲過程搜索 目的,下面的代碼代表我的存儲過程,在執行 存儲過程像轉換失敗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 [email protected]_PROJECT_CAT' 
IF(@PROJECT_TYPE !=0) 
SELECT @SQL = @SQL+' AND [email protected]_PROJECT_TYPE' 
IF(@COUNT_ZONE !=0) 
SELECT @SQL = @SQL+' AND ZONE_ID IN (SELECT ZONE_ID FROM ZONE_MASTER WHERE ZONE_NAME LIKE '''[email protected]+''' + ''%'')' 
ELSE 
SELECT @SQL = @SQL+' AND BLOCK_ID IN (SELECT BLOCK_ID FROM BLOCK_MASTER WHERE BLOCK_NAME LIKE '''[email protected]+''' + ''%'')' 
IF(@MIN_PRICE !=0) 
SELECT @SQL = @SQL+' AND MIN_ID >[email protected]_MIN_PRICE' 
IF(@MAX_PRICE !=0) 
SELECT @SQL = @SQL+' AND MAX_ID <[email protected]_MAX_PRICE' 
IF(@BEDROOM !='') 
SELECT @SQL = @SQL+' AND [email protected]_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

取數據SUMMARY_DETAILS_PROJECT_SEARCH_MAP 2,2,「諾伊達」,10,15「」 – 2014-10-31 12:25:49

+0

你也應該看看這篇文章這也解釋了一些這種類型的查詢存在缺陷。 http://sqlinthewild.co.za/index.php/2009/03/19/catch-all-queries/ – 2014-10-31 14:26:46

回答

1

這是因爲你把你身邊的是值單引號傳遞給sp_executesql,e.g:

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 + ''%'')' 

然後作爲參數添加到@Addresssp_executesql

+0

我檢查過不行了@GarethD – 2014-10-31 12:31:36

+1

注意比「不行」更具體嗎?我對SQL的瞭解並不差,但我在閱讀思想時很糟糕。你檢查了什麼?讓我知道您在問題中發佈的查詢中發生了什麼變化,以及** exact **錯誤消息是什麼,以及它發源的行,我可能有診斷問題的機會。 – GarethD 2014-10-31 12:34:57

+1

@PraveenSingh,你是否意識到即使Gareth特別引用了@ @ XP_PROJECT_CAT,他的陳述適用於查詢中的所有INT變量? – AHiggins 2014-10-31 12:48:04

相關問題