2014-10-31 2 views
-1

**SQL Server에서 데이터 유형 varchar를 int로 변환하는 이유는 무엇입니까?

저장 프로 시저를 실행하는 동안 나는, 코드 내 저장 프로 시저를 나타내는 아래 검색 목적으로 SQL 서버 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 [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에 매개 변수로 @Address를 추가, '노', 10, 15 ','당신은 또한 몇 가지 설명이 문서에서 살펴해야 –

+0

이러한 유형의 쿼리가있는 함정. http://sqlinthewild.co.za/index.php/2009/03/19/catch-all-queries/ –

답변

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

그런 sp_executesql

+0

작동하지 않는 것을 확인했습니다. @GarethD –

+1

"작동하지 않음"보다 구체적으로 관리해야합니까? SQL에 대한 지식은 나쁘지 않지만 독서의 정신에는 끔찍합니다. 너 뭐 봤어? 질문에 게시 된 쿼리에서 변경 한 사항과 ** 정확한 ** 오류 메시지가 무엇인지, 그리고 그것이 원래 발생한 행과 문제를 진단 할 수있는 기회를 알려주십시오. – GarethD

+1

@PraveenSingh, Gareth가 특별히'@ XP_PROJECT_CAT'를 참조 했음에도 불구하고 그의 진술이 쿼리의 모든 INT 변수에 적용되었다는 것을 깨달았습니까? – AHiggins

관련 문제