SQL Server: получить лучшую xx запись блога от Umbraco по параметру - PullRequest
3 голосов
/ 26 мая 2010

После 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

который, однако, не возвращает запись, есть идеи?

Ответы [ 2 ]

1 голос
/ 26 мая 2010

Попробуйте изменить оператор SQL, чтобы он создавался, добавляя параметры по мере их отправки как часть оператора, например

'SELECT TOP ' + @max + ' [nodeId] '.....
0 голосов
/ 26 мая 2010

Проблема заключается в том, как вы пытаетесь использовать параметры в предложениях LIKE.

т.е. значения @creatorID и @nodeType на самом деле не используются в условиях LIKE - вы на самом деле ищете 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
...