2010-05-26 2 views
3

다음 SQL에 의해 Umbraco에서 최고 XX 블로그 기록을 얻을 :SQL 서버 : 내가 원하는 것을 얻을 매개 변수

SELECT TOP (50) [nodeId] 
FROM [dbo].[cmsContentXml] 
WHERE [xml] like '%creatorID="29"%'  
    AND [xml] like '%nodeType="1086"%' 
ORDER BY [nodeId] DESC 

것은 내가 매개 변수로 숫자를 전달해야합니다, 그래서 난이 다음과

exec sp_executesql N'SELECT TOP (@max) [nodeId] FROM [dbo].[cmsContentXml] WHERE [xml] like ''%creatorID="@creatorID"%'' AND [xml] like ''%nodeType="@nodeType"%'' ORDER BY [nodeId] DESC',N'@max int,@creatorID int,@nodeType int',@max=50,@creatorID=29,@nodeType=1086 

그러나, 어떤 기록도 돌려주지 않는다, 어떤 생각?

답변

1

SQL 문을 수정하여 명령문의 일부로 매개 변수를 추가하여 문을 작성하도록하십시오.

'SELECT TOP ' + @max + ' [nodeId] '..... 
+0

차이점은 무엇입니까? 매개 변수와 문자열 연결은 무엇입니까? – ccppjava

+0

문자열 연결의 일부로 매개 변수를 추가하고 있습니다. 매개 변수는 저장 프로 시저에 사용되며, 예에서는 문자열 연결을 사용하고 있습니다. –

+2

경고 : 문자열 작성 방법을 사용하면 SQL 주입 공격에 취약합니다. 참조 : http://msdn.microsoft.com/en-us/library/ms161953.aspx –

0

문제는 LIKE 절에있는 매개 변수를 사용하려는 방식 때문입니다.

@creatorID의 값 즉

실제로 LIKE 조건에서 @nodeType 사용하지 않는 - 당신은 실제로 (예를 들어)이 같은 문자 그대로의 XML 검색하는 '% creatorID = "creatorID @"'

SELECT TOP (@max) [nodeId] 
FROM [dbo].[cmsContentXml] 
WHERE [xml] like '%creatorID="@creatorID"%' 
    AND [xml] like '%nodeType="@nodeType"%' 
ORDER BY [nodeId] DESC 

하지만 그 대신 :

SELECT TOP (@max) [nodeId] 
FROM [dbo].[cmsContentXml] 
WHERE [xml] like '%creatorID="' + CAST(@creatorID AS VARCHAR(50)) + '"%' 
    AND [xml] like '%nodeType="' + CAST(@nodeType AS VARCHAR(50)) + '"%' 
ORDER BY [nodeId] DESC 

그래서 뭔가 같은 : 당신은 당신의 쿼리로 나오지 않는지 확인해야 할 것

DECLARE @SQL NVARCHAR(1000) 
SET @SQL = ' 
    SELECT TOP (@max) [nodeId] 
    FROM [dbo].[cmsContentXml] 
    WHERE [xml] like ''%creatorID="'' + CAST(@creatorID AS VARCHAR(50)) + ''"%''  
     AND [xml] like ''%nodeType="'' + CAST(@nodeType AS VARCHAR(50)) + ''"%'' 
    ORDER BY [nodeId] DESC' 

exec sp_executesql @SQL, 
    N'@max int,@creatorID int,@nodeType int', 
    @max=50,@creatorID=29,@nodeType=1086