2010-05-26 3 views
3

После SQL получить то, что мне нужно:SQL Server: получить верхнюю запись хх пользователя из Umbraco параметром

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

это работает, однако какова разница, параметр и строка concat? – ccppjava

+0

Вы добавляете параметр как часть конкатенации строк. Параметр используется для хранимых процедур, и в вашем примере используется конкатенация строк. –

+2

ВНИМАНИЕ: использование подхода строкового построения уязвимо для атак SQL Injection. См .: http://msdn.microsoft.com/en-us/library/ms161953.aspx –

0

Проблема связана с тем, как вы пытаетесь использовать параметры в предложениях 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 
Смежные вопросы